编写一个shell脚本来查找二项式系数c(n,k)

编写一个shell脚本来查找二项式系数c(n,k),shell,Shell,我不明白为什么第一个阶乘不能正确返回,尽管它的计算是正确的。 假设输入n为7,k为3,则7的阶乘计算为5040,但返回176。 代码看起来像一个Bash脚本。报告说: 返回[n] 使函数停止执行并将n指定的值返回给其调用方。如果省略n,则返回状态为在函数体中执行的最后一个命令的状态。如果return由陷阱处理程序执行,则用于确定状态的最后一个命令是在陷阱处理程序之前执行的最后一个命令。如果在调试陷阱期间执行return,则用于确定状态的最后一个命令是调用return之前陷阱处理程序执行的最后一个

我不明白为什么第一个阶乘不能正确返回,尽管它的计算是正确的。 假设输入n为7,k为3,则7的阶乘计算为5040,但返回176。

代码看起来像一个Bash脚本。报告说:

返回[n]

使函数停止执行并将n指定的值返回给其调用方。如果省略n,则返回状态为在函数体中执行的最后一个命令的状态。如果return由陷阱处理程序执行,则用于确定状态的最后一个命令是在陷阱处理程序之前执行的最后一个命令。如果在调试陷阱期间执行return,则用于确定状态的最后一个命令是调用return之前陷阱处理程序执行的最后一个命令。如果函数外部使用了return,但在通过source)命令执行脚本期间,它会导致shell停止执行该脚本,并返回n或脚本中执行的最后一个命令的退出状态,作为脚本的退出状态

如果提供n,则返回值为其最低有效8位。如果return由非数字参数提供,或者在函数外部使用,而不是在源执行脚本期间使用,则返回状态为非零。任何与返回陷阱相关联的命令都会在函数或脚本结束后恢复执行之前执行

注意,返回用于设置退出状态;因此,该值被限制为0到255

通常,shell函数通过回送返回结果。例如:

fact()
{
    echo $1
    i=1
    f=1
    while [ $i -le $1 ]
    do
        f=`expr $f \* $i`
        i=`expr $i + 1`
    done
    echo $f
    return $f
}
echo enter value of n
read n
echo enter value of k
read k
fact $n
r1=$?
echo $r1
r2=`expr $n - $k`
fact $r2
r3=$?
echo $r3
fact $k
r4=$?
echo $r4
r5=`expr $r3 \* $r4`
echo $r5
result=`expr $ / $r5`
echo $result

请告诉我们您提供的确切输入、您获得的确切输出以及预期输出。通过编辑您的问题来完成。完成…感谢您的快速回复
factorial() {
  [[ "$1" -lt 2 ]] && echo 1 && return
  echo $(( $1 * $( factorial $(($1 - 1)) ) ))
}

$ echo $(factorial 7)
5040
fact()  
{  
    i=1  
    f=1  
    while [ $i -le $1 ]  
    do  
        f=`expr $f \* $i`  
        i=`expr $i + 1`  
    done  
    echo $f  
}  
echo enter value of n  
read n  
echo enter value of k  
read k  
r1=$(fact $n)  
r2=`expr $n - $k`  
r3=$(fact $r2)  
r4=$(fact $k)  
r5=$(echo "scale=2; $r3*$r4 " | bc)   
result=$(echo "scale=2; $r1/$r5 " | bc)  
echo $result  
this is the final code i came up with.... all thanks to you @alexp