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

时间:2018-05-16 08:12:25

标签: 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

我无法理解为什么第一个因子没有正确返回,尽管它是正确计算的。 假设我输入的n为7,k为3,则7的阶乘计算为5040,但返回176。 this is the output screen

2 个答案:

答案 0 :(得分:1)

代码看起来像Bash脚本。 Bash manual page说:

  

返回 [n]

     

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

     

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

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

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

factorial() {
  [[ "$1" -lt 2 ]] && echo 1 && return
  echo $(( $1 * $( factorial $(($1 - 1)) ) ))
}

$ echo $(factorial 7)
5040

答案 1 :(得分:0)

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