アルゴリズムの実装にいくつかのエラーがありました。再帰的アプローチを使用している場合は、実際には格納されたデータを必要としたいので、grid
を使用する必要はありません。あなたは現在の位置から2つの可能なサブパスを返す必要があります - それだけです!したがって、コードの主なアイデアにいくつかの変更を加える必要があります。
私は可能な限りあなたの元のコードの多くを維持しようとしましたが、まだそれが動作します
def pathCounterNaive(width, height, startX = 0, startY = 0):
if startX >= width or startY >= height:
return 0
if startX == width-1 and startY == height-1:
return 1
return pathCounter(width,height, startX+1, startY) + pathCounter(width,height, startX, startY+1)
slowK=pathCounterNaive(3,3)
print(slowK)
パラメータwidth
とheight
は、頂点の数を表し、そのためであることを、覚えておいてください。 2
ではなく、2x2
グリッドの場合は3
です。このコードは純粋な再帰を使用しているため、非常に遅いです。あなたの暗記のアプローチを使用する場合は、次のようにコードを変更する必要があります。
import numpy as np
def pathCounter(width, height):
grid = np.zeros((height+1, width+1))
def pathCounterInternal(x, y):
if x==0 or y==0:
return 1
grid[x, y] = pathCounterInternal(x,y-1)+pathCounterInternal(x-1,y)
return grid[x, y]
grid[width, height] = pathCounterInternal(width, height)
return grid[width, height]
k=pathCounter(2,2)
print(k)
をここでは2x2
グリッドのパラメータとして2
でそれを呼び出す必要があります。このコードは、すでに計算されたパスのキャッシングのためにはるかに高速です。
具体的な問題は何ですか? – FlashTek
https://projecteuler.net/archives –
15番目の質問です。私はPythonでのみ解決したい、再帰とPythonの他の概念を学ぶ必要がある –