bash中Fibonacci递归函数的奇怪错误:输出错误

A strange error in Fibonacci recursive function in bash: error in the output

我正在尝试为斐波那契数列编写递归 bash 函数。到目前为止,我有如下代码:

#!/bin/bash
Fibo() {
   case  in
     0) echo 0;;
     1) echo 1;;
     *) echo $[$[$Fibo $[-1]]+$[$Fibo $[-2]]] ;;
   esac
}

for (( i=0; i<=; 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...

密码是什么"is doing":

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

这里有一个更简单的方法来重现您的问题:

#!/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  in
     0) echo 0;;
     1) echo 1;;
     *) echo $[$[$(Fibo $[-1])]+$[$(Fibo $[-2])]] ;;
   esac
}

for (( i=0; i<=; i++ )); do
   Fibo $i
done

结果:

$ ./foo 10
0
1
1
2
3
5
8
13
21
34
55