1

以下の関数が溢れているのですが、その理由がわかりません。xを0、yを0、dimを2で実行すると、結果は6になります。ただし、オーバーフロー時に関数のLong値(xまたはy)が554であることを示すエラーが発生します。xとyは両方ともdim値によって制限されているため、これは不可能です。私のテストでは2に設定されています。コードは次のとおりです。

def lattice(dim: Long, x: Long, y: Long): Long = { 
  if (x == dim && y == dim) {
    1
  }
  if (x >= dim) {
    lattice(dim,x,y+1L)
  }
  if (y >= dim) {
    lattice(dim,x+1L,y)
  }
  else {
    lattice(dim,x+1L,y) + lattice(dim,x,y+1L)
  }
}
4

2 に答える 2

5

あなたはelse2つの場所で行方不明です。これは、がの場合でも最終行が実行されx >= dim、xが。を超えることを意味しますdim。代わりにこれを試してください:

if (x == dim && y == dim) {
    1
} else if (x >= dim) {
    lattice(dim,x,y+1L)
} else if (y >= dim) {
    lattice(dim,x+1L,y)
} else {
    lattice(dim,x+1L,y) + lattice(dim,x,y+1L)
}
于 2012-12-22T23:41:33.880 に答える
1

クリス:

最後のステートメントに合計があるため、Youd関数は末尾再帰ではありません。偶然にも、この合計には。への2つの呼び出しが含まれlatticeます。ただし、末尾再帰であるためには、最後の統計は定数(最初の場合と同様if)または関数自体の呼び出し(2秒など)である必要がありますelse if

関数を末尾再帰に変更する方法がわからないことを認めます。アルゴリズムによっては、関数の末尾再帰を実行できない場合があります。

ありがとう、

ラファエル・アフォンソ

于 2012-12-23T00:16:14.773 に答える