You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:40:24