讲师中心 微信公众号
AI工具推荐 视频效率加速

c++如何实现阶乘计算_c++递归与循环逻辑对比【示例】

胖丽酱_9238

胖丽酱_9238

发布时间:2026-03-13 01:53:27

|

1096人浏览过

|

来源于php中文网

原创

0! = 1 是阶乘的数学定义,也是递归终止的唯一合法出口;漏掉将导致无限递归、栈溢出或段错误;首行应写 if (n == 0) return 1;还需防范溢出等边界问题。

c++如何实现阶乘计算_c++递归与循环逻辑对比【示例】

递归写法:为什么 factorial(0) 必须返回 1

因为阶乘的数学定义就是 0! = 1,不是“没有意义”或“该报错”,而是递归终止的唯一合法出口。漏掉这个特例,factorial(1) 会调用 factorial(0),再调用 factorial(-1)……无限递归直到栈溢出。

常见错误现象:Segmentation fault (core dumped) 或程序卡死,调试时发现调用栈深度异常大。

实操建议:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 递归函数第一行就该是 if (n == 0) return 1;,别写成 n (负数输入应单独处理)
  • 用 unsigned int 或 size_t 当参数类型,从类型层面排除负数输入可能
  • 递归版只适合小数值(n 左右),再大就会溢出 <code>long long,和递归无关,是整数范围问题

循环写法:for 和 while 在阶乘里没本质区别

两者性能、可读性、安全性几乎一致,选哪个纯看团队习惯或上下文风格。但要注意初始化值和边界条件——循环版最容易错的是把初始结果设成 0 而不是 1。

立即学习“C++免费学习笔记(深入)”;

常见错误现象:永远返回 0,因为 result = 0; for(...) result *= i;,乘法链从零开始就全归零。

实操建议:

  • 结果变量必须初始化为 1:long long result = 1;
  • 循环变量从 2 开始即可(1! = 1,乘不乘 1 都一样),避免无谓迭代
  • 如果输入是 0 或 1,循环体一次都不执行,靠初始值 1 正确返回,这点比递归更“自然”

溢出判断:C++ 没有内置溢出检查,得自己防

无论是递归还是循环,21! 就超出 long long(约 9.2e18),但 C++ 默认不报错,只会静默回绕成负数或小正数,结果完全不可信。

使用场景:如果函数要用于校验输入、生成测试数据或教学演示,不加溢出检测等于给出错误答案。

实操建议:

  • 每次乘法前检查:if (result > LLONG_MAX / i) { /* 溢出 */ },注意除法避免实际溢出
  • 用 std::optional<long long></long> 或返回 std::pair<long long bool></long> 表达“算得出来 / 算不出来”
  • 别依赖 std::numeric_limits 的 max() 做运行时比较——它只是常量,不参与溢出防护逻辑

模板与 constexpr:编译期阶乘真能用,但有硬限制

constexpr 版本在编译期展开,快且零开销,但只适用于字面量输入(比如 factorial()),运行时变量不行;模板递归深度也受编译器限制(通常默认 256 层,factorial() 直接编译失败)。

性能影响:编译时间变长,目标文件体积略增,但运行时确实没函数调用、没循环、没分支。

实操建议:

  • 写成变量模板更干净:template<size_t n> constexpr long long factorial_v = N ? N * factorial_v<n-1> : 1;</n-1></size_t>
  • 别试图用它算用户输入——int n; std::cin >> n; auto x = factorial_v<n>;</n> 这行通不过编译
  • 想兼顾编译期和运行时?得写两个版本,用 if consteval(C++23)或 SFINAE 分流,复杂度陡增,多数场景没必要

最易被忽略的点:阶乘函数从来不只是“算个数”,它暴露的是你对边界、类型、溢出、求值时机的理解。写对 0! 和防住 21! 溢出,比纠结递归还是循环重要得多。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
python如何计算数的阶乘
python如何计算数的阶乘

方法:1、使用循环;2、使用递归;3、使用math模块;4、使用reduce函数。更多详细python如何计算数的阶乘的内容,可以阅读下面的文章。

465

2023.11.13

python求阶乘教程大全
python求阶乘教程大全

本专题整合了python求阶乘相关教程,阅读专题下面的文章了解更多详细内容。

260

2025.11.08

python语言求阶乘
python语言求阶乘

本专题整合了python中阶乘相关教程,阅读专题下面的文章了解更多详细步骤。

407

2025.12.06

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5947

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2528

2023.08.10

讯飞绘文AI选题与热点策划合集
讯飞绘文AI选题与热点策划合集

本专题介绍讯飞绘文选题中心与AI选题方法,涵盖热点发现、赛道筛选、选题评估和内容规划,解决创作者找灵感难题。

0

2026.10.22

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

20

2026.10.21

Playwright 页面操作指南
Playwright 页面操作指南

Playwright页面操作专题汇集元素定位、点击与输入、等待响应、多页面切换、Iframe、事件监听及文件处理的已审核文章,便于按操作场景查阅示例与常见问题。

0

2026.10.21

Playwright 入门教程
Playwright 入门教程

Playwright入门专题汇集测试框架安装、VS Code配置、录制脚本、编写首个用例、运行调试及查看报告的已审核文章,帮助初学者搭建端到端测试流程。

0

2026.10.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn