Linux bash脚本,添加数字的recursion

我想知道如何recursionbash脚本中工作。

我想插入数字作为参数:

sh script.sh 4 

结果是(1 + 2 + 3 + 4)= 10

这是我写的,在我的脑海里工作得很好,但是不能工作。

 n=$1 j=1 result=0 recursion(){ result=`expr $result + $j` j=`expr $j + 1` if [ "$n" -gt 0 ]; then recursion #is this how you do recursion? n=`expr $n - 1 else echo $result fi } recursion 

我想我想像的是对的,但可能我错了。

不要使用全局变量:

 #!/bin/bash add_recursively () { local n=$1 local sum=${2:-0} if (( n == 0 )); then echo $sum return fi $FUNCNAME $((n - 1)) $((sum + n)) } # input validation if ! [[ $1 =~ ^[[:digit:]]+$ ]]; then echo "I need a non-negative integer, not $1" exit 1 fi echo $(add_recursively $1) 

笔记:

  • local声明指定的变量是本地函数( ref )
  • sum=${2:-0}将“sum”变量定义为第二个参数,如果第二个参数为空或未定义,则为0( ref )
  • 当前正在运行的函数( ref )的$FUNCNAME名称。 这是递归调用,传递“n-1”和“sum + n”作为参数。

这可以作为一个shell函数来实现:

 rec() { [ "$1" -gt 0 ] && echo $(( $1 + $( rec $(($1-1)) ) )) || echo 0 ; } 

以下是示例结果,显示在命令行中定义的rec ,然后运行几种情况:

 $ rec() { [ "$1" -gt 0 ] && echo $(( $1 + $( rec $(($1-1)) ) )) || echo 0 ; } $ rec 4 10 $ rec 5 15 $ rec 6 21 

工作原理:函数rec采用一个整数参数。 它首先检查该参数是否大于零。 这是使用test完成的: [ "$1" -gt 0 ] 。 如果它大于零,则将参数添加到rec $(($1-1)) 。 如果参数为零,则返回(回波)零。

使用if / then / else来实现:有些人可能会更清楚地知道&& / || 逻辑被替换为if语句:

 rec() { if [ "$1" -gt 0 ] then echo $(( $1 + $( rec $(($1-1)) ) )) else echo 0 fi } 

你可以使用这个递归函数:

 recuradd() { n=$1 [[ $n -eq 0 ]] && return (( res += n-- )) recuradd $n } 

然后打电话使用:

 res=0; recuradd 4; echo $res 10 res=0; recuradd 5; echo $res 15