【问题标题】:Recursive Fibonacci in Bash scriptBash 脚本中的递归斐波那契
【发布时间】:2013-06-12 18:09:43
【问题描述】:

这是我的尝试:

#!/bin/bash

function fibonacci(){

first=$1
second=$2

if (( first <= second ))
then
return 1

else 

return $(fibonacci $((first-1)) ) + $(fibonacci $((second-2)) )
fi
}

echo $(fibonacci 2 0)

我认为我在使用 else 语句时遇到了问题。我在第 14 行收到错误 return: +: numeric argument required

我遇到的另一个问题是即使我执行echo $(fibonacci 0 2),脚本也不会显示任何数字。我认为它会显示 1,因为在这种情况下我会返回 1。有人可以给我一些关于如何做到这一点的提示吗?

在检查了你的一些答案后,这是我的第二次尝试。它可以正常工作,只是它以 1+1+1+1 等形式显示第 n 个斐波那契数。有什么想法吗?

#!/bin/bash

function fibonacci(){

first=$1
second=$2

if (( first <= second ))
then
echo 1


else 

echo $(fibonacci $((first-1)) ) + $(fibonacci $((first-2)) )
fi
}

val=$(fibonacci 3 0)
echo $val

我的最后一次尝试:

#!/bin/bash

function fibonacci(){

first=$1

if (( first <= 0 ))
then
echo 1


else 

echo $(( $(fibonacci $((first-1)) ) + $(fibonacci $((first-2)) ) ))
fi
}

val=$(fibonacci 5)
echo $val

谢谢各位。

【问题讨论】:

  • 如果我删除 (( )) 我得到错误 first-1: command not foundsecond-1: command not found
  • 您可以对照rosettacode.org/wiki/Fibonacci_sequence#UNIX_Shell检查您的工作
  • unix 返回值(或退出状态)在一个 int 范围内 (0..255)。要从函数返回值,您需要将函数打印到标准输出,函数调用看起来像 val=$(functionName arg ...)
  • 在 bash 中呈指数增长?你有什么事吗? :)
  • 是的,我喜欢玩不同的编程语言只是为了好玩

标签: bash fibonacci


【解决方案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】:

$(...) 替换运算符被替换为命令的输出。您的函数不会产生任何输出,因此 $(...) 是空字符串。

函数的返回值进入$?,就像外部命令的退出代码一样。

因此,您需要生成一些输出(使函数回显其结果而不是返回它)或在每次调用后使用$? 来获取值。我会选择回声。

【讨论】:

  • 退出状态不是为了返回一般数据;即,bash 函数并非旨在模仿数学函数。退出代码仅用于指示函数是否成功。与调用者通信的正确方法是写入标准输出,或者(排在第二位)通过设置全局参数。
【解决方案3】:

正如 Wumpus 所说,您需要使用例如echo 产生输出。 但是,您还需要修复递归调用。 最外层的操作将是一个加法,也就是你想要的:

echo $(( a + b ))

ab 都是 fibonacci 的替换,所以

echo $(( $(fibonacci x) + $(fibonacci y) ))

xy 依次是算术表达式,所以每个都需要自己的$(( )),给出:

echo $(( $(fibonacci $((first-1)) ) + $(fibonacci $((second-2)) ) ))

如果您对此感到困惑,您应该将组件放入临时变量并将表达式分解为部分。

至于实际的斐波那契,不清楚您为什么要传递 2 个参数。

【讨论】:

  • 第二个参数只是触发递归基本情况的数字。我在第一次尝试时犯了一个错误。 echo $(( $(fibonacci $((first-1)) ) + $(fibonacci $((second-2)) ) )) 应该是 echo $(( $(fibonacci $((first-1)) ) + $(fibonacci $((first-2)) ) ))
  • 哦,伙计,我想你刚刚回答了我刚刚提出的关于为什么我得到 1+1+1+1 作为输出的问题。让我检查一下,我会更新.. 更新:是的,它完全有效。谢谢大佬!
【解决方案4】:

短版,递归

fib(){(($1<2))&&echo $1||echo $(($(fib $(($1-1)))+$(fib $(($1-2)))));}

【讨论】:

    【解决方案5】:

    虽然使用递归计算斐波那契数当然是可能的,但它的性能很糟糕。使用递归的一个非常糟糕的例子:对于每个(子)斐波那契数,必须再计算两个斐波那契数。

    一种更快、更简单的方法使用迭代,可以在这里找到:

    https://stackoverflow.com/a/56136909/1516636

    【讨论】:

      猜你喜欢
      • 2017-11-18
      • 2015-05-30
      • 2010-12-03
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      • 2017-09-10
      相关资源
      最近更新 更多