Python でファーストクラスの関数を使用する方法を学ぶのに役立つ例を作成しています。一般的に、「非 Pythonic」と叫ぶ 1 行のコードを除いて、思いついたソリューションに満足しています。
したがって、私が取り組んでいる問題はここで定義されています。パズルは、最終的に -3 を返す "2" を含む 6 つの単純な関数の 1 つの順列 (可能な 720 のうち) を探します。
これが私の解決策です。これは、考えられるすべての 6 関数順列とその結果を単純にダンプします。
def perform (fun, arg):
return fun(arg)
def a(n):
return n + 2
def d(n):
return n / 2.
def m(n):
return n * 2
def p(n):
return n ** 2
def r(n):
return n ** 0.5
def s(n):
return n - 2
if __name__ == "__main__":
from itertools import permutations
for i, perm in enumerate(permutations([a, d, m, p, r, s])):
try:
k = perform(perm[5], perform(perm[4], perform(perm[3], perform(perm[2], perform(perm[1], perform(perm[0], 0))))))
except ValueError:
k = float('nan')
print "%03d. %s: %8.8f" % (i + 1, ''.join([x.__name__ for x in perm]), k)
私には正しくないように思われる行は、ネストされたperform
呼び出しのある行です: k = perform(...perform(...(
。私がする必要があるのは、順列タプルの最初の関数を 0 に適用し、次にその関数の結果をタプルの 2 番目の関数に適用することです。コンポーネント関数を適用する最終的な結果が得られるまで、順列タプルを介して同様に続けます。 .
perm
引数として 0 から始めて、対応する結果に関数を連続して適用するよりクリーンな方法はありますか? 私はmap
再帰をいじりましたが、上記のソリューションよりもエレガントなソリューションを見つけることができませんでした。