0

この C++ コードは、年が 1 になった後も停止しません。1331 で停止するはずです (最初に保存されたと表示されます)。うまくいけば、再帰を使用するのは初めてです。基本的な何かが欠けているだけではありません。よろしくお願いします。私はうまくいかなかった複数の変更を試みました。

Sample input:

- Enter inital amount to save: 1000
- Enter yearly interest rate (e.g. 0.10 for 10): .1
- Enter number of years of compounded interest: 3

Output: 

 iAmount: 1100
 Years: 3
 iAmount: 1210
 Years: 2
 iAmount: 1331
 Years: 1
 Saved up: 1331
 Saved up: 1210
 iAmount: 1210
 Years: 1
 Saved up: 1210
 Saved up: 1100

void interest(int iAmount, double rate, int years, double saved){

    saved = iAmount * (1+rate);
    iAmount = saved;

    cout << "iAmount: " << iAmount << "\n";
    cout << "Years: " << years << "\n";



    while(years>1){

        years = years - 1;
        interest(iAmount, rate, years, saved);
    }
    if(years == 1){
        cout << "Saved up: " << iAmount << "\n";
        return;
    }
}
4

1 に答える 1

1

再帰を扱うときは、コードを再帰ケースと基本ケースの 2 つの部分に分割する必要があることを覚えておく必要があります。

あなたは正しい基本ケースを持っています: if (years == 1). これは、答えを印刷するだけの「最も単純な」ケースです。

あなたは再帰的なケースについて正しい考えを持っています。再帰的な場合は常に「問題をもう少し単純にするにはどうすればよいか」と考えてください。この場合、あなたは「今年稼いだ金額を計算できます」と言っています。これは、saved変数を使用して行います。次に、「より単純な」問題で再帰呼び出しを行うことにより、このステップを完了したことを示します。つまり、計算する必要がある年数を減らしました。最終的に、基本ケースに到達します。

問題があるのは、各ステップで複数の再帰呼び出しを行っていることです。3 年間の金利計算の簡単な例を考えてみましょう。あなたは尋ねるべきです:

「3年後の貯蓄額は?」

再帰の考え方について、あなたは次のように言います:「それには答えられませんが、1 年後にどれだけ節約できたかはわかります。この新しい金額を考えると、2 年後にどれだけ節約できるかを尋ねることができます。 "

これは、節約した金額を印刷できる 1 年になるまで繰り返されます。

しかし、実際に行っているのは、再帰的な各ステップで次のように言うことです。再帰的戦略と反復的 (ループを使用) 戦略を効果的に混合しています。

メソッドが自分自身を呼び出すタイミングを描くことをお勧めします (各再帰呼び出しとそのパラメーターを示すツリー状の図)。コードが期待どおりに動作しない理由を理解するのに役立つことを願っています。


補足として、 arms-reach 再帰に注意してください。これは、基本ケースが可能な限り単純ではない場合です (わずか 1 年後の利息を計算するよりも単純なことを考えてください)。

于 2013-10-05T01:34:25.267 に答える