2009-08-17 11 views
1

私は小さな再帰的なコードで打たれます。私は出力を印刷してうまく印刷しますが、実際に答えを数えるためにカウンタを置くと、すごく奇妙なエラーが出ます。pythonのすくい取りと再帰

total = 0 
def foo(me, t): 
    if t<0: 
     return 
    if t==0: 
     total = total+1 
     return 
    for i in range(1, me+1): 
     total = total+1 
     return foo(i, t-i) 

それはローカル変数は代入する前に、参照言う、まあ、私はそのていないグローバル変数について....最初の行に合計を参照してくださいしようとしています、私は、グローバルにもなく、無駄に使用しようとしました。

これはすべてのアイデアですか?

+1

で、この問題のためにあるのですか? – Svante

+2

あなたの "for"ループは各再帰で一度だけ実行され、 'i'は常に1になります。 – Svante

答えて

1

あなたの機能では、合計をグローバルとして設定することを忘れています。あなたは「私はグローバルでも無駄に使ってみた」と言った。それはすべてのエラーをスローしません下に、私はそれをしようとするが、:

total = 0 
def foo(me, t): 
    global total 
    if t<0: 
     return 
    if t==0: 
     total = total+1 
     return 
    for i in range(1, me+1): 
     total = total+1 
     return foo(i, t-i) 
+0

エラーをスローしませんが、答えは間違っています。例えばfoo(99,100)を試してみると、101が間違っています。ただし、宣言と使用法の合計を出して印刷を開始すると、正しい回数だけ印刷されます。 – hasanatkazmi

+0

このスレッドは、私が言っていることを詳しく述べるかもしれません。 http://mail.python.org/pipermail/python-list/2001-September/104562.html – hasanatkazmi

+2

あなたの分析が間違っています:101が正しい答えです。 7行目または10行目に達するたびに合計を1つ追加します。後者はあなたが[1,100]でtでヒットし、前者はt = 0でヒットします。 「グローバル」は問題ではない。 –

2

他の人が述べたように、あなたは合計global文が必要です。また、Svanteが指摘したように、ループはコード化されていないので、iは常に1です。だから、あなたのコードの同等のバージョンで:

total = 0 
def foo(me, t): 
    global total 
    if t < 0: 
     return 
    total = total + 1 
    if t == 0: 
     return 
    return foo(1, t-1) 

foo(99, 100) 
print total 

そのFOO(99、100)を参照しやすくする必要があります私はありませんあなたは、本質的に100から0までカウントダウンしているので、実際に101になりますなぜあなたは別の考えをしていますか?

1

私はあなたが本当にあなたがやろうとしているか知っているかわからない... (グローバルキーワードを追加すると、誤った結果が得られますが、エラーを封じることを言って、少なくとも場合)

あなたはを行う多分あなたは(あなたがやっている)総参照しようとするためにしようとしている場合

に声明「全世界」が必要(あなたがfoo(99、100を実行したときに何を期待している)?)

あなたの境界線条件が間違っていますか?

引数(99、100)

  1. fooはスキップされますと

    「原因2 if文、次のループで

  2. ループ:

    for i in range(1, 100): 
    total += 1 
    return foo(i, 100-i) 

本当に同等です


    else: 
    total += 1 
    return foo(1, 99) 

に基づいて(Svanteは言っていたように)あなたの二つの条件 のfoo(1,99)が正しく生成されている場合、合計+ = 100

(それはあなたの"他"文が持ち込む実行されます99回100の合計、そしてそれはあなたの「間違った」101に合計をプッシュする場所ならば、最終的には、T == 0に達すると、最後の決勝を実行します)

また、あなたの第二の場合

ためのelifを使用する必要があります
1

一般的なアドバイス氷、再帰は常にグローバル変数ではなく、戻り値を使用する必要があります。再帰にはすでに独自の複雑さがあり、副作用でそれを増やし、明確なインターフェースではない場合、それをさらに悪化させます。

あなたは、この行で何かを試してみてください:

def foo(me, t): 
    if t<0: 
     return 0 
    if t==0: 
     return foo(me, t+1) 
    return foo(me-1, t) 
    for i in range(1, me+1): 
     tot = foo(i, t-i) 
    return tot 

注:このコードは間違っで、それははあなたの問題を解決しないであろうと、それはも、独自に動作しないます。私は、管理が簡単な再帰をどのように設計するかという考えを与えるだけのものです。

0

おかげさまで、ありがとうございますyouarf、Liffredo。 私は間違っていました、私は物事を追加する前に戻っていたことを知らなかった、ループは一度だけ実行していた、私はコードを修正しました。それはこのようなものです:

def foo(me, t): 
    if t<0: 
     return 0 
    if t==0: 
     return 1 
    toreturn = 0 
    for i in range(1, me+1): 
     toreturn = toreturn + foo(i, t-i) 
    return toreturn 

このコードを使用すると、スコープを意味するかhttp://projecteuler.net/index.php?section=problems&id=76