Bash 有没有一种方法可以在预先确定用户输入量的情况下计算#s的阶乘?i、 将计算1-7.不初始化7个差异变量
有没有办法避免为每个变量创建4个不同的Bash 有没有一种方法可以在预先确定用户输入量的情况下计算#s的阶乘?i、 将计算1-7.不初始化7个差异变量,bash,shell,Bash,Shell,有没有办法避免为每个变量创建4个不同的do-while语句?例如,我想计算1-7!不初始化7个不同变量和初始化7个不同变量。这可能吗 下面是我希望程序如何启动以及输出应该是什么的示例 ./filename.sh 1 2 3 4 5 6 7 The factorial 1! is 1 The factorial 2! is 2 The factorial 3! is 6 The factorial 4! is 24 … 代码: 使用循环来处理每个参数 #!/bin/bash while [ $
do-while
语句?例如,我想计算1-7!代码>不初始化7个不同变量和初始化7个不同变量。这可能吗
下面是我希望程序如何启动以及输出应该是什么的示例
./filename.sh 1 2 3 4 5 6 7
The factorial 1! is 1
The factorial 2! is 2
The factorial 3! is 6
The factorial 4! is 24
…
代码:
使用循环来处理每个参数
#!/bin/bash
while [ $# -gt 0 ]
do
n=$1
on=$n
fact=1
while [ $n -ge 1 ]
do
fact=$(expr $fact \* $n)
n=$(expr $n - 1)
done
echo "The factorial of $on is $fact"
shift # go to the next argument
done
为了好玩,我尝试了一个递归解决方案:
#!/bin/zsh
function fact {
if (($1 < 2))
then
echo 1
else
expr $1 '*' $(fact $(($1-1)))
fi
}
for arg
do
fact $arg
done
#/bin/zsh
功能事实{
如果($1<2))
然后
回声1
其他的
expr$1'*'$(事实$($1-1)))
fi
}
对于arg
做
事实$arg
完成
我最初认为,由于堆栈溢出,它很快就会爆炸,但它在很短的时间内计算出了非常大的值(比如200!)(在zsh中;没有在其他shell中尝试过!) 当n>20时会发生什么?@WalterA它溢出。如果你想计算真正大的阶乘,你需要使用一种具有更大整数的语言。非常感谢你,它工作起来很有魅力!我刚刚开始学习shell脚本,所以我不确定循环过程将如何工作。这是一个非常常见的习惯用法,用于将参数循环到脚本。我很难相信你所学的教程中竟然没有。shell的整数是否足够容纳200!?谢谢你的反馈!我试过这段代码,我喜欢它递归解决问题的方式。@Barmar:我只是将输出与Ruby程序的阶乘进行了比较(Ruby有无限精度的算术),结果是一样的,在lesat上达到200
。这在zsh
中起作用,因为它有浮点运算,当整数溢出时,它会自动将整数提升为浮点。但是由于精度的损失,结果可能不准确。@Barmar:我认为这不能解释结果。计算200!给出一个结果,它由375个十进制数字组成,其中300多个是有效的,我指的是正确的数字。要用浮点运算达到这样的精度,需要一个超过1000位的尾数,但事实并非如此。但我现在明白了,为什么它能工作了:Shell算法只在步骤$((I-1))
中完成,这只涉及小数字。乘法是使用expr
完成的,具有任意精度。因此,它不仅可以在Zsh中工作,还可以在bash中工作。
#!/bin/zsh
function fact {
if (($1 < 2))
then
echo 1
else
expr $1 '*' $(fact $(($1-1)))
fi
}
for arg
do
fact $arg
done