bash中的递归fibonacci函数

时间:2013-10-27 22:14:16

标签: bash recursion fibonacci

我正在仔细阅读我的代码以获得一些帮助,并且在大约4个月之前遇到了一个帖子,但是当用户的最终版本在发布到bash时不起作用,并产生一些奇怪的结果。这是我的版本,它也会产生一些奇怪的结果:

#!/bin/bash
fib()
{
ind=$1

if (( ind <= 0 ))
 then echo 0
elif (( ind = 1 ))
 then echo 1
else
  echo $(( $(fib $((ind - 1)) ) + $(fib $((ind - 2)) ) )) 
fi
}
echo fibbonacci sequence number $1 is $(fib $1)

所以这段代码最终总是输出1. ./fib.sh 5输出 fibbonacci序列号5是1

所以我试着把代码编写得更接近前一个提问者的代码,

#!/bin/bash

fib()
 {
  ind=$1

if (( ind <= 0 ))
 then echo 1
else
  echo $(( $(fib $((ind - 1)) ) + $(fib $((ind - 2)) ) )) 
fi
 }
 echo fibbonacci sequence number $1 is $(fib $1)

虽然我不理解这里的逻辑,但实际上它开始输出斐波纳契数, 但现在我遇到了一个稍微不同的问题; ./fib.sh 3输出: fibbonacci序列号3是5 ./fib.sh 5输出: fibbonacci序列号5是13 我们知道第3个斐波纳契数是1,第5个是3,那么是什么给出的?代码似乎跳过几个斐波纳契数字,我无法弄清楚我的代码在逻辑上是错误的。

4 个答案:

答案 0 :(得分:2)

通常在编写Fibonacci序列逻辑时,您必须特殊情况下的前两个数字。这就是第一个用户所做的:特殊套管0和1.

你删除了一个特殊套管的实例并将所有内容移动了一个索引,这解释了一个转变。另一个很简单:代码是零索引的。这就是为什么一切都“一分为二”。

原始代码有什么问题?这一行:

elif ((ind = 1))

ind设置为1.否则就没问题。

对代码的一个简单修复就是替换这一行:

if (( ind <= 0 ))

if (( ind <= 2 ))

然后离开你。这为您提供了您期望的单索引行为:

cternus@astarael ~/foo> for i in `seq 1 10`; do ./foo.sh $i; done
fibbonacci sequence number 1 is 1
fibbonacci sequence number 2 is 1
fibbonacci sequence number 3 is 2
fibbonacci sequence number 4 is 3
fibbonacci sequence number 5 is 5
fibbonacci sequence number 6 is 8
fibbonacci sequence number 7 is 13
fibbonacci sequence number 8 is 21
fibbonacci sequence number 9 is 34
fibbonacci sequence number 10 is 55

答案 1 :(得分:1)

#!/bin/bash

function fib(){
    if [ $1 -le 0 ]; then
        echo 0
    elif [ $1 -eq 1 ]; then
        echo 1
    else
        echo $[`fib $[$1-2]` + `fib $[$1 - 1]` ]
    fi

}

fib $1

答案 2 :(得分:0)

#!/bin/bash
#fibonacci sequence function
fib()
{
ind=$1

if (( ind <= 0 ))
 then echo 0
elif (( ind == 2 ))
 then echo 1
else
  echo $(( $(fib $((ind - 1)) ) + $(fib $((ind - 2)) ) )) 
fi 
}
echo fibbonacci sequence number $1 is $(fib $1)

所以我的问题在于等式检查

elif (( ind = 1 ))

我应该使用double =,并将1更改为2,所以它应该是

elif (( ind == 2 )) 

最终我的正确脚本应该是这样的

#!/bin/bash
#fibonacci sequence function
fib()
{
ind=$1

if (( ind <= 1 ))
 then echo 0
elif (( ind == 2 ))
 then echo 1
else
  echo $(( $(fib $((ind - 1)) ) + $(fib $((ind - 2)) ) )) 
fi
 }
echo fibbonacci sequence number $1 is $(fib $1)

感谢bajillion和一个对Christian Ternus的帮助,我已经编程了几年了,完全应该看到等式检查错误&gt;。&lt;

答案 3 :(得分:0)

有趣的是,Korn shell比其他shell更快地执行@christianternus'脚本:

$ for a in sh bash zsh ksh; do echo "shell: $a"; time for i in $(seq 1 20); do $a bin/fib.sh $i; done | md5sum; done
shell: sh
5fece53a38f2df040bfaf9632c2b7f4b  -
real    0m29.508s
user    0m3.788s
sys     0m11.785s

shell: bash
5fece53a38f2df040bfaf9632c2b7f4b  -
real    0m29.906s
user    0m3.604s
sys     0m11.235s

shell: zsh
5fece53a38f2df040bfaf9632c2b7f4b  -
real    0m29.203s
user    0m2.505s
sys     0m14.377s

shell: ksh
5fece53a38f2df040bfaf9632c2b7f4b  -
real    0m0.942s
user    0m0.843s
sys     0m0.079s