Linux bash脚本,用于添加数字的递归

时间:2014-03-17 18:04:13

标签: linux bash recursion

我想弄清楚递归在bash脚本中是如何工作的。

我想插入数字作为参数:

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

我认为我想象得对,但可能我错了。

3 个答案:

答案 0 :(得分:5)

不要使用全局变量:

#!/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"变量作为第二个参数,如果第二个参数为空或未设置(ref
  • ,则为0
  • $FUNCNAME当前正在运行的函数的名称(ref)。这是递归调用,传递" n-1"和"总和+ n"作为参数。

答案 1 :(得分:1)

这可以作为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语句,有些人可能会发现更清楚:< / p>

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

答案 2 :(得分:0)

您可以使用此递归函数:

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