2012-01-02 11 views
5

私は「逆転」バッジを得て答えを読んでいましたが、OPが彼らの宿題の多くを前もってやっていない再帰に関する質問を見つけました。本当に面白い答えを除けば、@ machieloはan answerをpythonで投稿しました。マシン上でグリップを実行する必要がありました。私はまだそれを理解していない。私はこの再帰の使用を理解していません

def recursive(x): 
    if x > 10: 
     print recursive(x/10) 
    return x%10 

>>> recursive(2678) 
2 
6 
7 
8 

私は私の最初の推測を試してみたが、私はそれがわかりました...それは2です

>>> 2678/10 
267 
>>> 267/10 
26 
>>> 26/10 
2 
>>> 2%10 
2 

間違っていることを知っています。 xの他の数字の出力はどのように評価されますか?

EDIT

それは私がここに取得しないprint声明です。私のようなコードを変更:

>>> def recursive(x): 
if x > 10: 
    print x 
    print recursive(x/10) 
return x%10 

>>> #I will comment the interpreter session here... 
>>> recursive(2345) 
2345 # first feed in...print the raw number `x` 
234 # 2345/10 does equal 234...the 5 is being held back somewhere... 
23 # and each pass through the recursive loop removes the last digit... 
2 # but where was it being stored at, so that each evaluation of 
3 # x > 10 finally started returning False 
4 # and returns the number, exiting the function 
5 # ... 

私はそれぞれの間を通して実行することを考えている、print recursive(x/10)への呼び出しは、それ自身のブランドの新しいベースケースと入力して、各...

、新しい関数オブジェクトを作成します

別のヒント、誰ですか?

最後に

皆様に感謝します。私は今これを理解していると感じる...そのトリックはそれほど多くなかったprintそれはx%10だった。 2345%10 == 5 ...

また
>>> def recursive(x): 
print "Raw `x`:", x 
if x > 10: 
    print "Recurse `x`:", x 
    print recursive(x/10) 
print "Last `x`:", x  
return x%10 

>>> recursive(2345) 
Raw `x`: 2345 
Recurse `x`: 2345 
Raw `x`: 234 
Recurse `x`: 234 
Raw `x`: 23 
Recurse `x`: 23 
Raw `x`: 2 
Last `x`: 2 
2 
Last `x`: 23 
3 
Last `x`: 234 
4 
Last `x`: 2345 
5 

、中に行って、I previously linked toが...私はあなたのコメントをupvoteことを約だと、最初の答えに更新誰にクレジット:

>>> def recursive(x): 
if x >= 10: 
    print recursive(x/10)  
return x%10 
+0

と私は完全には分からないと思います。 "xの各数字"とはどういう意味ですか? –

+0

私はすべての悪い推測で私の質問を泥沼にしたくありません**しかし** ... 'print recursive(x/10)'を 'return recursive(x/10)'に置き換えると、ベースケースが再帰の最初のパス。 – Droogans

+0

あなたの例は私のためにその出力を生成しません – joaquin

答えて

11

は私がprintいくつかのステートメントを追加すると、それは本当に便利だと思う:

def recursive(x): 
    print '[start] recursive({0})'.format(x) 
    if x > 10: 
    print recursive(x/10) 
    print '[return] recursive({0}) = {1}'.format(x, x%10) 
    return x%10 

print recursive(2678) 

出力は次のようになります。擬似コードであなたの例のステップ実行

[start] recursive(2678) 
[start] recursive(267) 
[start] recursive(26) 
[start] recursive(2) 
[return] recursive(2) = 2 
2 
[return] recursive(26) = 6 
6 
[return] recursive(267) = 7 
7 
[return] recursive(2678) = 8 
8 
+0

偉大な答え、本当に – joaquin

+0

@joaquinありがとう、私はそれを感謝します。 – jcollado

+0

フォーマットをコピーして少し微調整して、メモリから構築するようにしました。良い例え! – Droogans

3

この関数は、数字を出力しますその数の

それは次のように動作します。

def recursive(x): 
    if x > 10: 
    # Divide x by 10 and round down. This chops off the last decimal place. 
    # Now feed that new x without the last decimal place back into recursive() 

    # return x's last digit 

は基本的に、それはxまでprintものは一桁の番号ではありません。

あなたが混乱している部分は、おそらくそれが小数点以下の桁をその順序で印刷している理由です。これは、関数が再帰する間、親関数がまだ実行されているために発生します。

その単一の番号のコードを試してみてください。


編集:私も自分自身を混乱させています。

コードは前printreturnを呼び出し、再帰の終了の際に最後レベル、最初の数字うち最後から2番目の印刷ことを意味します。次のレイヤーについても同様です。

+0

いいえ、@Blender、私はスタックダイアグラムを模倣して私の恐ろしい試みを書き留めます。 – Droogans

5

(ダッシュの数が、再帰の深さを示す):

-call recursive(2678) 
--2678 > 10, call recursive(267) 
---267 > 10, call recursive(26) 
----26 > 10, call recursive(2) 
-----return 2%10 (which is 2) 
----print 2, then return 26 % 10 (which is 6) 
---print 6, then return 267 % 10 (which is 7) 
--print 7, then return 2678 % 10 (which is 8) 
-return 8 
+0

'print'ステートメントは再帰ループの後半まで評価されず、実際には結果を表示しません。それはあなたが「プリント2、次に26%の10を返す」という意味ですか?あなたは最後の行が 'return 8'であるので、私はこれを考えています。 – Droogans

+0

@Droogans私はそれが正しいと思います。最後の8はコンソールで表示されます – joaquin

+0

評価されていません。 printステートメントは、メソッドを再帰的に呼び出し続けるため、まだ解決できません。値が底にある値を返すまで、値を解決することはできません。したがって、再帰はバブルアップのように見えます。 – Jordan

1

再帰を考慮すると、コールスタックに注意してください。終了条件は、10(2)は、前に返され、2%に達すると再帰呼び出しはrecursive()機能が何かは、あなたがスタック上で終わるものをそう印刷される前にスタック上に呼び出し、すべてが

recursive(2) # end condition is met so returns 2%10 
recursive(26) 
recursive(267) 
recursive(2678) # the initial call 

です推進していますその関数は26%10(6)を返し、これはスタック上のすべての再帰関数呼び出しが返るまで続きます。結果は次の一連の印刷呼び出しです。

print 2 
print 6 
print 7 
8 

8は実際には印刷されません。通訳者からちょうど良いものが返されます。たとえば、pythonスクリプトなどで印刷されていることを確認したい場合は、print recursive(2678)

関連する問題