Bash脚本中的递归Fibonacci

时间:2013-06-16 18:46:14

标签: bash fibonacci

这是我的尝试:

#!/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

谢谢老兄。

5 个答案:

答案 0 :(得分:5)

#!/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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

echo $(( a + b ))

ab都是fibonacci的替换,所以

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

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

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

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

至于实际的斐波纳契,目前尚不清楚为什么要传递2个参数。

答案 3 :(得分:0)

短版,递归

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

答案 4 :(得分:0)

虽然可以递归计算斐波那契数,但它的性能很差。一个使用递归的真实错误示例:对于每个(子)斐波那契数,必须再计算两个斐波那契数。

一种更快,更简单的方法使用迭代,如下所示:

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