-2

countカウントを再帰的に渡すかインクリメントしてから、再帰に渡すことができるようにしたいと考えています。count = 0ただし、インクリメント時に使用できるように宣言する必要があることはわかっています。私はまだPythonを学んでおり、再帰的にカウントをインクリメントするのは難しいと感じています。誰かがこれで私を助けてくれますか?

現在、再帰を行うたびに count が 0 に再送信されるため、コードが間違っていることはわかっています。count を 3 番目の引数として設定したくありません。

私のコード:

def getNth(head, n):
    count = 0
    if count == n:
        count += 1
        return head.value
    else:
        if head.next is not None:
            getNth(head.next,n)
        else:
            print 'not in linked list'
4

2 に答える 2

2

上ではなく逆に数えます。

def getNth(head, n):
    if n == 0:
        return head.value
    return getNth(head.next, n - 1)

ただし、これは実際にはうまく機能せず、リストが妥当な長さであるとスタック オーバーフローが発生します。通常、関数型プログラミング スタイルは適切な Python スタイルではありません (たとえば、末尾再帰は Python の機能ではないため)。

ループを書き出すだけです。

def getNth(head, n):
   for _ in xrange(n):
       head = head.next
   return head.value
于 2013-10-11T06:45:55.473 に答える
1

これは、Python でクリーンに実行される再帰の一般的なパターンであるため、言及する価値があります。

メソッドでは、再帰の深さを追跡するのに役立つキーワード引数を使用できます。メソッド シグネチャの変更は簡単です。

def getNth(head, n, count=0):

0 は へのデフォルトの引数ですcount。最初の呼び出しでそれを省略して (または で明示的に呼び出してcount=0)、問題ありません。その後、 で簡単に再帰的に呼び出すことができgetNthますgetNth(*args, count + 1)

Python では再帰が非常に遅いことを説明したことに注意してください。パフォーマンスを気にする場合は、再帰的なソリューションよりも反復的なソリューション (多くの場合ジェネレーターを含む) を優先する必要があります。

于 2013-10-11T06:58:32.860 に答える