阶乘是1到n的正整数积,0!定义为1;php中可用递归实现,需处理n=0边界,小数值(如n≤100)适用,但受调用栈深度限制。

什么是阶乘,PHP里怎么算
阶乘(n!)就是从1乘到n的正整数积,比如5! = 1×2×3×4×5 = 120。0的阶乘定义为1,这是数学约定,PHP中也必须处理这个边界情况。
递归写法:简洁但要注意深度限制
PHP8.1支持尾调用优化的初步探索,但默认仍受限于函数调用栈深度。小数值(如n ≤ 100)用递归很直观:
function factorial(int $n): int
{
if ($n - 必须检查负数输入,否则无限递归或逻辑错误
- PHP8.1严格类型声明让参数和返回值更安全,避免隐式转换出错
- 超过约1000层递归会触发“Maximum function nesting level”错误,生产环境慎用大数
迭代写法:稳定、高效、推荐用于实际项目
用for或while循环计算,内存占用恒定,无栈溢出风险,适合任意大小的合法整数(受int范围限制):
function factorialIterative(int $n): int
{
if ($n - 从2开始循环,跳过1和0的冗余乘法,提升一点效率
- 变量$result初始为1,自然兼容n=0和n=1的情况
- PHP8.1的JIT编译器对这类循环有更好优化,执行更快
大数阶乘怎么办:用GMP扩展保精度
当n ≥ 20,int就会溢出(PHP int通常最大约9E18),结果变0或负数。此时应启用GMP扩展(PHP8.1默认可用):
function factorialBig(int $n): GMP
{
if ($n - GMP返回的是GMP对象,用gmp_strval()转成字符串才能安全显示
- 无需手动处理进位或数组拆分,底层已高度优化
- 若服务器未启用gmp,可退化到bcmod+bcadd模拟,但性能差很多
加个实用封装:自动选择策略
一个健壮的阶乘函数应根据输入自动选型——小数用int,大数用GMP:
function smartFactorial(int $n): string
{
if ($n - 20是经验阈值:PHP int在21!时开始溢出(21! = 51090942171709440000 > PHP_INT_MAX≈9.2E18)
- 运行时检测扩展是否存在,比硬依赖更友好
- 统一返回string,调用方无需关心内部类型,避免类型混淆
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











