C ++ - 递归函数没有结束

时间:2013-10-05 01:14:20

标签: c++ function recursion

这个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;
    }
}

1 个答案:

答案 0 :(得分:1)

使用递归时,您必须记住,您应该将代码分成两个独立的部分:递归情况和基本情况。

您拥有正确的基本案例:if (years == 1)。这是你最简单的&#34;只打印出答案的情况。

你对递归案例有正确的想法。总是把递归的情况看作&#34;如何让问题变得更简单?&#34;在这种情况下,你说:&#34;我可以计算今年的收入,&#34;您使用saved变量执行的操作。然后,通过使用&#34;更简单的&#34;进行递归调用,表明您已完成此步骤。问题 - 即你减少了需要计算的年数。最终,您将达到基本案例。

您遇到问题的地方是您在每一步都要进行多次递归调用。考虑一个3年利率计算的简单示例。你应该问:

&#34; 3年后我节省的金额是多少?&#34;

有了递归的想法,你会说:&#34;好吧,我无法回答这个问题,但我可以告诉你一年后你节省了多少钱。现在我可以问这个新的数量,2年后节省了多少。&#34;

重复这一过程,直到你可以打印出已保存的金额为止一年。

然而,你实际做的是在你说的每个递归步骤:&#34;我可以告诉你一年后你节省了多少钱,现在每年剩下多少年后节省了多少钱。&#34;您正在有效地混合递归和迭代(使用循环)策略。

我建议在方法调用时抽出(一个树状的图表显示每个递归调用及其参数)。我希望它能帮助您弄清楚为什么您的代码没有按预期运行。


作为旁注,请注意arms-reach recursion。这是基于你的基本情况并非尽可能简单的事情(想想比一年后计算利息更简单的事情)。