C++递归阶乘函数实现求助:基于《C++ Primer Plus》习题
嘿,我来帮你搞定这个《C++ Primer Plus》的阶乘习题!结合你的需求,我写了完整的实现代码,还会一步步给你解释细节:
完整实现代码
#include <iostream> #include <limits> // 用于处理输入缓冲区的numeric_limits using namespace std; // 递归阶乘函数 long long factorial(int n) { // 边界条件:0! 定义为 1,这是递归的终止点 if (n == 0) { return 1; } // 递归逻辑:n>0时,n! = n*(n-1)! else if (n > 0) { return n * factorial(n - 1); } // 处理非法输入:负数没有阶乘 else { cout << "⚠️ 错误:负数不存在阶乘!" << endl; return -1; // 返回标记值表示输入无效 } } int main() { int num; char continueChoice; // do-while循环:保证用户至少能输入一次数值 do { cout << "请输入一个整数来计算其阶乘:"; cin >> num; // 可选:加入非整数输入的验证 if (cin.fail()) { cout << "⚠️ 错误:请输入有效的整数!" << endl; cin.clear(); // 清除错误状态 cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 清理缓冲区 continue; // 跳过本次循环,重新输入 } long long result = factorial(num); // 只有输入有效时才输出结果 if (result != -1) { cout << num << "! = " << result << endl; } // 询问用户是否继续计算 cout << "是否继续计算?(输入 y/Y 继续,其他键退出):"; cin >> continueChoice; // 清理输入缓冲区的换行符,避免下次输入直接读取到空字符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); } while (continueChoice == 'y' || continueChoice == 'Y'); cout << "程序结束啦!👋" << endl; return 0; }
关键部分解释
1. 递归阶乘函数
- 为什么用long long返回类型?因为阶乘的数值增长极快,普通
int只能容纳到12!就会溢出,long long能支持到20!左右,完全满足习题需求。 - 边界条件必须优先处理:递归函数一定要有终止条件,这里
0! = 1就是让递归停下来的关键,没有它程序会陷入无限递归导致崩溃。 - 非法输入处理:加入了负数判断,给用户明确的错误提示,避免程序默默输出错误结果。
2. 循环输入逻辑
- 用do-while循环而不是普通while:这样用户第一次不需要先输入确认,直接就能进入计算流程,体验更友好。
- 输入缓冲区清理:
cin.ignore()是为了处理用户输入完选择后按下的换行符,如果不清理,下次cin >> num会直接读取到这个换行符,导致程序异常。 - 可选的输入验证:代码里加了非整数输入的判断,能避免用户输入字母、符号时程序陷入错误状态,让程序更健壮。
内容的提问来源于stack exchange,提问作者Georgy90
相关产品推荐
相关产品推荐

