Linux shell 编程利用迭代函数实现简单阶乘!!

2020/11/12
初学Linux shell编程,用的不习惯,今天想用迭代函数实现求简单的阶乘,搞了大几个小时,觉得有必要记下来。


1、题目

编程实现 n 的阶乘, n=10。

2、用while搞

这个比较简单:

n=10
i=$n
ans=1
while [ $i -gt 1 ] 
do
        let ans=`expr $ans \* $i`
        let i=`expr $i - 1`
done
echo $n"! ="$ans

当然也可以用until,这俩转化很容易,只有判断条件不同。

3、迭代函数

之前用其他语言写迭代函数的时候觉得很简单的,但是用shell写,写成这样:

#!/bin/bash
function fac()
{
        n=$1
        if [ $n -eq 1 ]; then
                return 1
        else
                let m=`expr $n - 1`
                s=$(fac $m)
                return $(($n*$s))
        fi
}

echo $(fac 10)

在这里插入图片描述
当然这不是最初的版本,这是我改了很多边最后报错最少的一个。到这里之后百思不得其解,最后找到一个博客,恍然大悟,博客链接如下:

https://www.cnblogs.com/duanxz/p/4661767.html

这位前辈示例是想让函数返回一个字符串,而我想让函数返回的结果与数值作数乘运算。前辈最后写道:

Shell函数返回值只能是整形数值,一般是用来表示函数执行成功与否的,0表示成功,其他值表示失败。因而用函数返回值来返回函数执行结果是不合适的。如果要硬生生地return某个计算结果,比如一个字符串,往往会得到错误提示:“numeric argument required”。
如果一定要让函数返回一个或多个值,可以定义全局变量,函数将计算结果赋给全局变量,然后脚本中其他地方通过访问全局变量,就可以获得那个函数“返回”的一个或多个执行结果了。
总结一下函数返回值获取的方法:
1)用变量接收函数返回值,函数用echo等标准输出将要返回的东西打印出来。
2)用$?来接收函数的执行状态,但是$?要紧跟在函数调用处的后面。

对,用全局变量:

#!/bin/bash
s=1  #全局变量
fac()
{
        n=$1
        if [ $n -eq 1 ] ; then
                s=$(($s*1))
        else
                let m=`expr $n - 1`
                s=$(($s*$n))
                fac $m
        fi
}
fac 10
echo $s

在这里插入图片描述
值得一提的是,变量默认为全局变量 —— 函数体内没有明确指明该变量是局部变量(local var)时,其为全局变量。


总结一下函数返回值获取的方法:
1)用变量接收函数返回值,函数用echo等标准输出将要返回的东西打印出来。
2)用$?来接收函数的执行状态,但是$?要紧跟在函数调用处的后面。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪猪头拯救地球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值