这是我的尝试:
#!/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
谢谢老兄。
答案 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 ))
a
和b
都是fibonacci
的替换,所以
echo $(( $(fibonacci x) + $(fibonacci y) ))
x
和y
依次是算术表达式,因此每个都需要自己的$(( ))
,给出:
echo $(( $(fibonacci $((first-1)) ) + $(fibonacci $((second-2)) ) ))
如果您对此感到困惑,则应将组件放入临时变量中,并将表达式分解为多个部分。
至于实际的斐波纳契,目前尚不清楚为什么要传递2个参数。
答案 3 :(得分:0)
fib(){(($1<2))&&echo $1||echo $(($(fib $(($1-1)))+$(fib $(($1-2)))));}
答案 4 :(得分:0)
虽然可以递归计算斐波那契数,但它的性能很差。一个使用递归的真实错误示例:对于每个(子)斐波那契数,必须再计算两个斐波那契数。
一种更快,更简单的方法使用迭代,如下所示: