递归硬币计数器开发求助:无全局变量与循环实现的计数逻辑错误排查
解决递归硬币计数器的逻辑问题
我仔细看了你的代码,发现几个关键问题导致结果不符合预期,咱们一步步来修正:
核心问题分析
- 返回语句逻辑错误:你写的
return sum + coins(sum - 25);之后的return count++;永远不会执行,而且count是函数内的局部变量,每次递归调用都会重新初始化,根本起不到计数的作用。 - 递归逻辑完全偏离需求:你需要的是「选1枚当前面值的硬币,计数加1,再加上剩余金额的递归结果」,但你现在返回的是
sum + 递归结果,这完全不是计数的逻辑。 - 缺少硬币记录逻辑:你的需求里还要输出选中的硬币面值(比如输入16时输出
10 5 1),但原代码没有任何存储或输出硬币面值的逻辑。
修正后的代码实现
我们需要调整递归函数,让它返回硬币总数,同时用引用传递的vector来记录每次选中的硬币面值:
#include <iostream> #include <vector> using namespace std; // 递归函数:返回硬币总数,同时通过引用记录选中的硬币 int coins(int sum, vector<int>& usedCoins) { // Base case 1:金额小于0,说明这条路走不通,返回0 if (sum < 0) return 0; // Base case 2:金额刚好为0,不需要再选硬币,返回0 if (sum == 0) return 0; // 优先选大面值硬币(贪心策略,符合你示例的输出) if (sum >= 25) { usedCoins.push_back(25); return 1 + coins(sum - 25, usedCoins); } else if (sum >= 10) { usedCoins.push_back(10); return 1 + coins(sum - 10, usedCoins); } else if (sum >= 5) { usedCoins.push_back(5); return 1 + coins(sum - 5, usedCoins); } else if (sum >= 1) { usedCoins.push_back(1); return 1 + coins(sum - 1, usedCoins); } // 理论上不会走到这里,防止编译警告 return 0; } int main() { // 注意:main的返回类型应该是int,不是void int cents; vector<int> usedCoins; // 获取用户输入 cout << "Enter an amount in cents: "; cin >> cents; // 调用递归函数 int coinCount = coins(cents, usedCoins); // 输出结果 cout << endl; for (int coin : usedCoins) { cout << coin << " "; } cout << endl << coinCount << " coins" << endl; return 0; }
关键修正点说明
- 递归逻辑修正:每个分支返回
1 + coins(sum - 面值, usedCoins),其中1代表当前选中的这枚硬币,加上剩余金额的递归计数结果,完全符合你需求的逻辑。 - 硬币记录:通过
vector<int>& usedCoins引用传递,每次选中硬币就把面值存入vector,最后可以遍历输出。 - main函数规范:C++标准里
main函数的返回类型必须是int,原代码的void main()不符合标准,已经修正。 - Base case调整:保持
sum<0返回0(无效路径),sum==0返回0(无需再选硬币),逻辑正确。
测试结果
输入16美分时,程序会输出:
Enter an amount in cents: 16 10 5 1 3 coins
输入37美分时,会输出:
Enter an amount in cents: 37 25 10 1 1 4 coins
完全符合你的预期。
内容的提问来源于stack exchange,提问作者JohnH
相关产品推荐
相关产品推荐

