Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 有没有一种方法可以在预先确定用户输入量的情况下计算#s的阶乘?i、 将计算1-7.不初始化7个差异变量_Bash_Shell - Fatal编程技术网

Bash 有没有一种方法可以在预先确定用户输入量的情况下计算#s的阶乘?i、 将计算1-7.不初始化7个差异变量

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 [ $

有没有办法避免为每个变量创建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 [ $# -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