問題はpython(または同様の))で再帰関数が与えられ、それがそれ自体を参照しないように書き直すことができます。私はに適用される簡単な例を作りましたもちろん、非再帰関数にすることはできませんが、同じ再帰プロセスを実行する必要があります。
def fact(n):
if n == 0:
return 1
return n * fact(n - 1)
また、略記と同等です。
fact = lambda n: 1 if n == 0 else n * fact(n - 1)
この例では、関数定義内でfact
を呼び出さないでください。
編集:
追加の制約:ソリューションが機能するために割り当てが必要であってはなりません。
追加の制約なしの(コメントからの)1つの解決策は、2つの関数a
とb
を作成して、互いを交互に呼び出し、階乗を有効に実行することです。 2つの変数に2つの関数を割り当てる必要があるため、これは許可されません。
割り当てを必要としない関数の簡単な例は
f = lambda x: x + 1
ドラッグで実行するには55
、私はただ書くことができました
(lambda x: x + 1)(55)
したがって、割り当ては必要ありませんでした。
これに関するヒントはありますか?または私は不可能な問題にだまされていますか?
これはおそらく問題に関するものではありませんが、inspect
/types
マジックを使用すると、呼び出されている関数を再構築できます...
import types, inspect
def fact(n):
frame = inspect.currentframe()
fn = types.FunctionType(frame.f_code, frame.f_globals)
if n == 0:
return 1
return n * fn(n - 1)
print(fact(10))