这个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;
}
}
答案 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。这是基于你的基本情况并非尽可能简单的事情(想想比一年后计算利息更简单的事情)。