3

ccolumnと rowを取り、三角形のその場所rから数え0て数を返すプロシージャを定義しようとしています。

def pascal(c: Int, r: Int): Int = {
    if (c <= 0) 1
    else
        println(pascal(r, c-1) * (r-c)/c)
        pascal(r, c-1) * (r-c)/c
}

コードを実行すると:

>>>pascal(1,3) 

次のエラーがあります。

pascal: (c: Int, r: Int)Int
java.lang.StackOverflowError

どうすれば修正できますか?

ありがとう。

4

6 に答える 6

9

パスカル三角形の要素を取得するには、前の行の 2 つの要素を追加するだけです。

次のコードはそれを正しく行います。

def pascal(c: Int, r: Int): Int = {
    if (c <= 0 || c == r) 1
    else pascal(c, r-1) + pascal(c-1, r-1)
}  
于 2014-09-22T09:13:02.570 に答える
3

pascalで関数を再度呼び出す必要はないと思いますprintln。中括弧も使用する必要があります。少し書き直しました:

def pascal(c: Int, r: Int): Int = {
  var p = 1
  if (c > 0) {
    p = pascal(r, c-1) * (r-c)/c 
    println(p)
  }
  p
}

これは次のように出力されpascal(1,3)ます:

-1
-2

更新:私は正しい解決策を書きたいと思っていましたが、これが私が最終的に得たものです:

  def fact(n: Int, r: Int=1): Int = if (n==0) r else fact(n-1, n*r)

  def pascal(c: Int, r: Int): Int = {
    fact(c) / (fact(r) * fact(c-r))
  }

  def main(a: Array[String]) { 
    println(pascal(3, 2))
  }

(私が知っている)唯一の問題は、インデックスが0から始まる座標が正しくなければならないことです。パスカルの三角形の範囲外のものはゼロによる除算を引き起こします。これには、OPの与えられた例が含まれます-2pascal(1,3)つの数字しかありません行#1。

于 2013-09-24T10:19:15.690 に答える
3

パスカルの三角形のエントリと同じ二項係数を計算するこのバージョンを試すことができます。

  def pascal(col: Int, row: Int): Int = {

    val l = if (col > row / 2) col else row - col
    @tailrec
    def go(i: Int, acc: Int): Int = {
      if (i == l + 1) acc
      else go(i + 1, acc * (row - l + i) / i)
    }
    return go(1, 1);
  }

このソリューションは末尾再帰を使用するため、ここでは StackOverflowError は脅威ではありません。

于 2013-09-24T11:46:00.913 に答える
0

コード全体の例を次に示します。

object Main {

  def main(args: Array[String]) {
  println("Pascal's Triangle")

 for (row <- 0 to 10) {
  for (col <- 0 to row)
    print(pascal(col, row) + " ")

    println()
  }
 }


def pascal(c: Int, r: Int): Int = {
 if ( c <= 0 || c == r ){
    return 1
  }

  return pascal(c, r - 1) + pascal(c - 1, r -1)
}

}
于 2015-12-29T23:30:42.557 に答える