2016-12-12 9 views
0

再帰を使用して1 - x + x^2 - x^3 + .....を計算します。だからそれは1 - x*(1 - x*(1 - x*...であり、私は1 - x*F(x)をeacthの救助のステップに呼び出さなければならない。 Pythonで コードはここにある:私はを不思議各呼び出しで再帰関数の値を確認します。

def F(x, epsilon, k, y, iteration, value): 
    if(iteration == k): 
     print('run out of iterations',) 
     return 1 - x 
    else: 
     return 1 - x * F(x, epsilon, k, y, iteration + 1) 

現在の通話にFの瞬時値を知る方法があります。 ATMは私の意見では、私はそれを行うことはできません。批評家は歓迎!

def F(x, epsilon, k, y, iteration, value): 
    if(iteration == k): 
     print('run out of iterations',) 
     return 1 - x 
    else: 
     a=1 - x * F(x, epsilon, k, y, iteration + 1) 
     print a 
     return a 
+1

あなたは「現在のコールに 'F'の瞬時値を知っている」とはどういう意味ですか?あなたは、各値をファイルに記録したり、デバッガで見たり、その他の値を記録したりすることを意味しますか?私は本当の問題に遭遇しない限り、通常、最後のものを使用します。 –

+0

それを印刷するだけでOKです –

+1

'epsilon'、' y'、 'value'とは何ですか?ところで、再帰呼び出しで 'value'を渡すのを忘れました。あなたのコードを[mcve]に減らすのが最善です。質問している問題とは関係のない神秘的な変数を使ってコードを投稿しないでください。 FWIW。私は 'abs(x)<1'なら結果が' 1 /(1 + x) 'に収束することを知っていると思います。 –

答えて

0

を、私は通常ちょうど(私のデバッガを実行します私は今Spyderを使います)、再帰のさまざまなレベルで変化するさまざまな値を見てください。戻り値が問題になる場合は、よくあることですが、返す前にその値をローカル変数に格納して、デバッガで直接確認することができます。もちろん

result = 1 - x 
return result 

result = 1 - x * F(x, epsilon, k, y, iteration + 1) 
return result 

にごreturnラインを変更することを意味あなたのコード例では、あなたのケースであなただけの結果が出た後、関数の最後に単一returnラインを持つことができますとにかくより良いスタイルです。それだけで十分です。より深刻な状況では、私はおそらく、印刷後に休止input('Press any key to continue...')で、ラインresult =return線間

print(iteration, result) 

を追加、コンソールに値を印刷します。問題が本当に激しい場合は、値をテキストファイルに保存しますが、それは分析のために保存する利点のために表示の即時性を失います。

+0

'result'が常にsam番号を表示しない理由を説明できますか?つまり、xは定数なので、1-xも定数です。 –

+0

奇妙なことがコードで、特に再帰的なコードで発生する可能性があります。あなたの場合、私は 'x'と' 1-x'が一定であることを期待しますが、何かがそれを妨げる可能性があります。デバッグでは、できるだけ前提を少なくして、実際に何が起こっているかを確認する必要があります。もちろん、 'if'文は' 1-x'が必ずしも返されないということを意味していますので、 'result'は最初に' 1-x'を一番最初に再帰の最奥レイヤで印刷し、結果は異なります。 –

+0

私たちはなぜそれが一度だけ印刷されることを期待していますか?この関数は何度か呼び出されるので、何度も印刷されます!私はちょうどあなたのソリューションがどのように機能するかという理論的な説明が必要でした。なぜなら、現在の値をプリントアウトするのですが、最後まで計算の再帰をプリントアウトしないのです。 –

0

を意味するか、単純な問題のためにか理解するために

def F(x, epsilon, k, y, iteration, value): 
    if(iteration == k): 
     print('run out of iterations',) 
     res = 1 - x 
    else: 
     res = 1 - x * F(x, epsilon, k, y, iteration + 1) 

    print(res) 

    return res 
0

あなたはすなわち、それを返す前に、変数に結果を置くことができます:あなたが何か

0

これは、decorator機能の場合によく似ています。これは、装飾された機能に自動的に適用され、その機能を拡張されたバージョンに置き換えた機能です。

トレースの場合は、このようなものを使用できます。これは、それぞれのパラメータと結果を使用して関数のすべての呼び出しを印刷します。すべてがきれいにインデントされ、何が呼び出されたかが分かります。

このようにして、printステートメントを関数自体に追加する必要はありません。ただ、このようなあなたの関数にデコレータを適用します。

@trace 
def F(x, epsilon, k, y, iteration, value): 
    ... 

これはF = trace(F)に相当します。あなたの関数を呼び出してください。ここで

は簡単なフィボナッチ関数を使用する例を示します

@trace 
def fib(n): 
    return 1 if n < 2 else fib(n - 1) + fib(n - 2) 

>>> fib(2) 
> fib (2,) 
    > fib (1,) 
    < 1 
    > fib (0,) 
    < 1 
< 2 
関連する問題