web-dev-qa-db-ja.com

参照と割り当てなしの再帰

問題は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つの関数abを作成して、互いを交互に呼び出し、階乗を有効に実行することです。 2つの変数に2つの関数を割り当てる必要があるため、これは許可されません。

割り当てを必要としない関数の簡単な例は

f = lambda x: x + 1

ドラッグで実行するには55、私はただ書くことができました

(lambda x: x + 1)(55)

したがって、割り当ては必要ありませんでした。

これに関するヒントはありますか?または私は不可能な問題にだまされていますか?

6
Mercado

これはおそらく問題に関するものではありませんが、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))
1
AKX