【问题标题】:A recursive fibonacci function in bash [duplicate]bash中的递归斐波那契函数[重复]
【发布时间】:2013-10-27 22:14:16
【问题描述】:

我正在仔细阅读该视图以获取有关我的代码的一些帮助,并且遇到了大约 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 个输出 斐波那契序列号 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 个输出: 斐波那契数列 3 是 5 ./fib.sh 5 个输出: 斐波那契序列号 5 是 13 那么我们知道第 3 个斐波那契数是 1,第 5 个是 3 那么是什么给出的呢?代码似乎跳过了几个斐波那契数,我无法弄清楚我的代码在逻辑上有什么问题。

【问题讨论】:

  • 你有什么 bash 版本 (bash --version)。在GNU bash, version 4.2.8(2)-release (x86_64-apple-darwin11) 上输入您的代码就可以了。
  • OP:我不知道第三个斐波那契数是 1。请赐教。

标签: bash recursion fibonacci


【解决方案1】:

通常在编写斐波那契数列逻辑时,您必须对前两个数字进行特殊处理。这就是第一个用户所做的:特殊大小写 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

【讨论】:

  • 所以 elif ((ind = 1)) 设置 ind 为 1?我不明白,当我将 if (( ind
  • 几乎!您希望 == 进行相等检查,而不是 =
  • 好吧,我设法让脚本正常工作。非常感谢克里斯蒂安!
  • 没问题!如果这对您有帮助,请确保接受答案(单击复选标记)。
【解决方案2】:
#!/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

【讨论】:

  • 请评论您的代码。
  • 它对我不起作用。不知道为什么
【解决方案3】:
#!/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 ))

我应该使用双=,并将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 的帮助,我已经编程了几年,完全应该看到相等检查错误 >.

【讨论】:

  • 当然,这个在 bash 中的实现是非常不理想的(练习:计算你的 fib 函数被调用了多少次)!一个很好的练习是实施记忆。使用简单的 bash 数组很容易,而且很有趣!
【解决方案4】:

有趣的是,Korn shell 执行 @christianternus 的脚本比其他 shell 快得多:

$ for a in sh bash zsh ksh;做回声“外壳:$ a”; $(seq 1 20) 中 i 的时间;做 $a bin/fib.sh $i;完成 | md5sum;完毕 外壳:sh 5fece53a38f2df040bfaf9632c2b7f4b - 实际0m29.508s 用户 0m3.788s 系统 0m11.785s 外壳:重击 5fece53a38f2df040bfaf9632c2b7f4b - 真正的 0m29.906s 用户 0m3.604s 系统 0m11.235s 外壳:zsh 5fece53a38f2df040bfaf9632c2b7f4b - 真正的 0m29.203s 用户 0m2.505s 系统 0m14.377s 外壳:ksh 5fece53a38f2df040bfaf9632c2b7f4b - 实际0m0.942s 用户 0m0.843s 系统 0m0.079s

【讨论】:

    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2020-03-21
    • 2013-06-12
    • 2010-12-03
    • 2020-12-18
    相关资源
    最近更新 更多