我想插入数字作为参数:
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 ) $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