0

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

1 回答 1

1

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

你有正确的基本情况:if (years == 1). 这是您只需打印答案的“最简单”的情况。

您对递归案例有正确的想法。始终将递归案例视为“我如何使问题变得更简单一些?” 在这种情况下,您是在说:“我可以计算今年的收入”,您可以使用saved变量来计算。然后,您通过使用“更简单”的问题进行递归调用来表明您已经完成了这一步——即您减少了需要计算的年数。最终,您将达到基本情况。

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

“三年后我存了多少钱?”

用递归的想法,你说:“好吧,我不能回答这个问题,但我可以告诉你一年后你节省了多少。现在我可以问这个新的数额,两年后节省了多少。 "

重复此过程,直到您可以打印出节省的金额的 1 年。

但是,您实际上在做的是在每个递归步骤中您说:“我可以告诉您一年后您节省了多少,现在剩下的每一年,多年后节省了多少。” 您有效地混合了递归和迭代(使用循环)策略。

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


作为旁注,请注意arm-reach recursion。这就是您的基本情况并非如此简单的时候(想想比仅仅一年后计算利息更简单的事情)。

于 2013-10-05T01:34:25.267 回答