2

ComScip の MIT イントロを見ているのですが、再帰呼び出しを行う必要があります。弦の出現数を数えるカウンターがうまく収まらず困っていました。運が良ければ、カウンターの位置をいじって、次の解決策が機能しますが、理由はわかりません。

import string
target = "banana"
key = "an"
key_len = len(key)
found_pos = 0
found_pos = string.find(target,key)

def countSubStringMatchRecursive (target, key):
    counter=0
    found_pos = string.find(target,key)
    if(found_pos!=-1):      
        print "found"
        slice_pos = found_pos + key_len
        counter = countSubStringMatchRecursive (target[slice_pos:], key)
        counter+=1
        #print counter
    return counter

print countSubStringMatchRecursive (target, key)

ここに私の理解があります:

最初の再帰:

  1. 初期化カウンター=0

  2. メイン関数が実行されているため、これによりカウンターが再び 0 にリセットされます。

  3. カウンター+=1

  4. 0+1=1 であるため、カウンター値として 1 を返します。

私が理解していない部分は、counter=0 がカウンターを 0 に再初期化しない理由です。代わりに、以前の値を蓄積し、正しい結果を生成します。

4

1 に答える 1

3

counterメソッドにローカルな変数です。これは、各再帰スタック フレーム (それぞれの新しいメソッド呼び出しが新しい「スタック フレーム」を取得する) の独自のコピーを持つことを意味しますcounter。したがって、メソッドが呼び出されるたびに whilecounterが に設定されますが、これらの のすべてのコピーは、実際にはメモリの異なる部分であり、互いに影響しません。0counter

于 2013-03-29T04:41:39.333 に答える