2016-04-01 17 views
4

私はちょうど(0, 1)[ x > 5]のような文のif-elseの代わりの構造を見て、再帰で試してみたかったのですが何らかの理由で機能しません。ちょっと寂しい気がする。ここでなぜ「最大再帰深度を超えていますか」

は、私が代わりに交換しようとしている元のコードです:再帰の問題を与える

def f(n): 
    return 1 if n == 1 else n * f(n - 1) 

はオルタナティブ、:

def f(n): 
    return (n * f(n - 1), 1)[n == 1] 

代替コードの問題は何ですか?

+0

代替関数の本体の中に 'print n'を挿入することで、自分で問題をデバッグしようとするかもしれません。 –

+0

"n == 1のときどうなるの?"関数は自分自身を呼び出すのをやめますか、それとも続行しますか?何が止まるのでしょうか? –

+0

@BryanOakley私は、式がTrueに評価されると仮定します。これは1にキャストされ、タプルの2番目の要素を返します。再帰を停止します。 –

答えて

5

問題は、Pythonが[n == 1]でタプルをインデックス化する前に常にn * f(n - 1)を計算しようとすることです。

その結果、スタック上のメモリが不足するまで、関数は自分自身を呼び出し続けます。

https://docs.python.org/2/reference/expressions.htmlことを示す「評価順」に関するセクションがあります。

最初のコードはチェックが

ソースが成功した場合に呼び出しを行っていない、その後の再帰呼び出しの前n==1チェックを行うこと、およびすることによって、これを回避します左から右に実行されます。

2

最初の機能が短絡しています。 n * f(n - 1)n != 1の場合はと計算されます。

第二の機能では、Pythonはそうn * f(n - 1)は要素がアクセスされることはありません場合でも、常に計算で、両方の要素がlistを作成するために評価しなければなりません。この結果、無限の再帰が発生します。

関連する問題