簡體   English   中英

C ++-遞歸函數未結束

[英]C++ - Recursive function not ending

一年后,此c ++代碼不會停止。 它應該在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;
    }
}

使用遞歸時,您必須記住您應該將代碼分為兩個單獨的部分:遞歸案例和基本案例。

您有正確的基本情況: if (years == 1) 這是您“最簡單”的情況,您只需打印出答案即可。

您對遞歸案例有正確的想法。 始終將遞歸情況視為“如何使問題更簡單?” 在這種情況下,您說的是:“我可以計算今年的收入”,您可以使用saved變量來完成此操作。 然后,您通過進行“簡單”問題的遞歸調用來表明您已完成此步驟-即,您減少了需要計算的年數。 最終,您將達到基本情況。

您遇到問題的地方是您在每個步驟都進行了多個遞歸調用。 考慮一個簡單的3年利率計算示例。 您應該問:

“三年后我可以節省多少?”

關於遞歸的想法,您說:“好吧,我無法回答,但是我可以告訴您一年后您節省了多少。現在,我可以問給定這筆新金額,兩年后可以節省多少。 ”

重復此過程,直到您降至1年為止,然后可以打印出所節省的金額。

但是,您實際上在做的是在您說的每個遞歸步驟上:“我可以告訴您,一年后您已經節省了多少,現在剩下的每一年,那么多年后可以節省多少。” 您正在有效地混合使用遞歸和迭代(使用循環)策略。

我建議在該方法調用自身時繪制出來(一個樹形圖,顯示每個遞歸調用及其參數)。 我希望它可以幫助您弄清楚為什么您的代碼未按預期運行。


作為附帶說明,請注意手臂伸直遞歸 這是當您的基本案例不像可能的那么簡單時(想想比在一年后計算利息更簡單的方法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM