我正在尝试为斐波那契序列编写一个递归bash函数。到目前为止,我的代码如下:
#!/bin/bash
Fibo() {
case $1 in
0) echo 0;;
1) echo 1;;
*) echo $[$[$Fibo $[$1-1]]+$[$Fibo $[$1-2]]] ;;
esac
}
for (( i=0; i<=$1; i++ )); do
Fibo $i
done
以下是示例输出:
0
1
1
3
5
7
9
11
当然应该是0 1 1 2 3 5 8 13 ...
我试图将其写下来,我认为它应该可以工作。我的代码理解:
Fibo 0 -> = 0
Fibo 1 -> = 1
Fibo 2 -> Fibo 1 + Fibo 0 = 1 + 0 = 1
Fibo 3 -> Fibo 2 + Fibo 1 = 1 + 1 = 2
Fibo 4 -> Fibo 3 + Fibo 2 = 2 + 1 = 3
Fibo 5 -> Fibo 4 + Fibo 3 = 3 + 2 = 5
etc...
代码“正在做什么”:
Fibo 0 -> = 0
Fibo 1 -> = 1
Fibo 2 -> = 1 + 0 = 1
Fibo 3 -> = 3 (??)
Fibo 4 -> = 5 (this is probably 3+1+1)
Fibo 5 -> = 7 (this is probably once again 5+1+1)
Fibo 6 -> = 9 (once again 7+1+1)
您能帮我找出错误的根源吗? 我知道已经有很多类似Fibonacci的线程(并且我尝试遵循给出的建议),但是我没有找到解决问题的答案。
关于B
答案 0 :(得分:2)
这是重现问题的简便方法:
#!/bin/bash
foo() { echo 42; }
echo $[$foo 1]
这将打印1。
这是因为$foo
不是有效的变量(尽管此名称有一个函数),所以将其替换为空。 echo $[ 1]
自然打印1。
要扩展为函数的结果,请使用$(command substitution)
:
#!/bin/bash
foo() { echo 42; }
echo $[$(foo 1)]
这将显示42。这里将其应用于您的代码:
#!/bin/bash
Fibo() {
case $1 in
0) echo 0;;
1) echo 1;;
*) echo $[$[$(Fibo $[$1-1])]+$[$(Fibo $[$1-2])]] ;;
esac
}
for (( i=0; i<=$1; i++ )); do
Fibo $i
done
结果:
$ ./foo 10
0
1
1
2
3
5
8
13
21
34
55