我正在仔细阅读我的代码以获得一些帮助,并且在大约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,那么是什么给出的?代码似乎跳过几个斐波纳契数字,我无法弄清楚我的代码在逻辑上是错误的。
答案 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