Bash递归阶乘函数执行异常:num大于5时返回垃圾值
问题原因
- Bash 函数的
return返回值本质是进程退出状态码,仅支持0~255的无符号8位整数,超过范围的数值会自动对256取模,返回错误结果。 - 5的阶乘为120,处于合法范围内所以运行正常,6的阶乘为720,超过255触发溢出,最终返回
720 % 256 = 208,也就是你看到的垃圾值。
修复方法
Bash 函数要返回大于255的数值时,不要用return传递结果,改为直接将结果打印到标准输出,通过$()命令替换捕获输出即可,修正后的代码如下:
function fact { if (( $1 == 1 )) then echo 1 else prev=$(( $1 - 1 )) prev_fact=$(fact $prev) echo $(( $1 * $prev_fact )) fi } echo -n "Enter the number: " read num val=$(fact $num) echo "Factorial of $num is $val"
补充说明
- 修正后的写法支持的阶乘上限为Bash内置整数的存储范围,通常为64位有符号整数,最大可正常计算到20的阶乘。
- 你原代码中
expr和$(())写法效果一致,不过$(())是Bash内置的算术扩展,不需要调用外部命令,性能更高,更推荐使用。
内容的提问来源于stack exchange,提问作者pranftw
相关产品推荐
相关产品推荐

