我想弄清楚递归在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
我认为我想象得对,但可能我错了。
答案 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)
注意:
答案 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