2017-11-02 14 views
0

が同じになり、私は単純に思っ入力の階乗を計算する2次再帰関数を考えてみましょう:再帰的ラムダ関数のリスト選択で再帰制限エラーが発生するのはなぜですか?

  1. fact = lambda x: 1 if x == 0 else x * fact(x-1)

  2. fact = lambda x: [x*fact(x-1),1][x==0]

最初に実行されますが、罰金2番目の数字はエラーRuntimeError: maximum recursion depth exceededです。これは、x==0x!=0の入力の場合に当てはまります。

ラムダ関数が2番目のケースを処理できないのはなぜですか?

答えて

2

これらは同じではありません。第2の変形例では、のリスト内のの両方の式が評価され、それから適切な式が選択されます。しかし、これは、x == 0が起きても再帰が起こらないようにします。そして、再帰は負の数に続き、メモリの限界にぶつかります。一方、

... if ... else ...

は最初 ifキーワード以下の条件を評価し、 のみは、その結果に対応して式を評価します。

+0

これは意味があります。ありがとう – dylnan

関連する問題