私は自分自身を自己学習するために、プログラミングの練習のためにプロジェクトオイラーの質問をしています。私は、質問を数学的に行う方法と、プログラムで行う方法を完全によく知っています。
しかし、私はそれを行うためにいくつかの非常識なコードを考え出す必要があります。100個のネストされたループとPythonは、このエラーを陽気に発生させます。おそらく当然のことながら、100レベルのインデントで発生します。
IndentationError: too many levels of indentation
tally = 0
ceiling = 100
for integer_1 in range(0, 100, 1):
for integer_2 in range(0, 100 - integer_1, 2):
for integer_3 in range(0, 100 - integer_1 - integer_2, 3):
for integer_4 ....
for integer_5 ....
etc.
etc.
all the way to integer_100
私は解決策をグーグルで調べましたが、この問題は非常にまれであり、この主題に関する文献はほとんどなく、この他のスタックオーバーフローの質問(Python IndentationError:インデントのレベルが多すぎます)を見つけることができましたが、私の質問。
私の質問は-私の解決策を取り、いくつかの回避策を見つけるか、それが機能する方法でそれをリファクタリングする方法はありますか?私は本当に困惑しています。
編集:
nneonneoの答えのおかげで、私は質問を解決することができました。私のコードは、コードを適切にリファクタリングする方法を探している人々の将来の参照のためにここにあります。
from time import time
t = time()
count_rec_dict = {}
# for finding ways to sum to 100
def count_rec(cursum, level):
global count_rec_dict
# 99 is the last integer that we could be using,
# so prevent the algorithm from going further.
if level == 99:
if cursum == 100:
return 1
else:
return 0
res = 0
for i in xrange(0, 101-cursum, level+1):
# fetch branch value from the dictionary
if (cursum+i, level+1) in count_rec_dict:
res += count_rec_dict[(cursum+i, level+1)]
# add branch value to the dictionary
else:
count_rec_dict[(cursum+i, level+1)] = count_rec(cursum+i, level+1)
res += count_rec_dict[(cursum+i, level+1)]
return res}
print count_rec(0, 0)
print time() - t
これは私のコンピューターでは驚くべき0.041秒で実行されます。おお!!!!!今日は新しいことを学びました!