我看到了溢出和交换,但我似乎找不到答案。我目前正在尝试创建一个递归fibonacci函数。但是,当我尝试测试它(使用命令行条目)时,它一直返回错误。
fork: retry: Resource temporarily unavailable
我发现一篇文章说它与shell资源限制有关,但我觉得这可能不是我的问题,因为我看到了单独的帖子,递归函数能够很好地调用它们的函数。
我把操作分解成几个部分,看看到底发生了什么,但我找不到具体的问题--这可能与我调用函数的方式有关,但我也不确定。
不过,我可以很好地传递我想要的参数。它只对我输入的数字打印同样的错误。如果输入5,它会回显分叉错误5次。它返回,但不返回值..。
关于规范,我目前使用的是Bash版本4.4.20(1)
function fib_r
{
int=$1
for ((i=1; i<=int; i++))
do
f1=$(fib_r $((int-1)))
f2=$(fib_r $((int-2)))
fibo=$((f1+f2))
done
}我想要实现的是,当您在命令行中输入一个数字时,它确实计算了这个数字,但是它在每一步都显示了计算的数字,而不是从开始到结束返回最后的值:
一个示例输出:
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55发布于 2022-05-13 12:35:44
这个谢尔查克-clean代码修复了问题中的代码中的一些问题:
function fib_r
{
local -r n=$1
if (( n == 0 )); then
echo 0
elif (( n == 1 )); then
echo 1
else
local -r f1=$(fib_r "$((n-1))")
local -r f2=$(fib_r "$((n-2))")
echo "$((f1+f2))"
fi
return 0
}echo是结果,所以调用者可以使用它。命令替换 ($(command))通常只有当command将其结果输出到标准输出时才有用。local用于使变量成为函数的局部变量,这样它们就不会与使用该函数的程序中其他地方使用的变量发生冲突。使用-r (readonly)选项是因为变量不需要在函数中进行更改,并且可以防止其他函数意外地更改这些变量。int被更改为n,因为对于这样的函数来说,这是比较传统的(对于熟悉C或相关编程语言的人来说,int看起来真的很奇怪)。注意,这个函数非常慢。这部分是因为它使用命令替换(每次运行一个昂贵的子进程)来返回结果,但主要是因为这种特定的递归算法效率很低(参见Fibonacci序列的计算复杂性)。更快的递归实现是可能的。
问题被更新,以请求一个函数,该函数将所有Fibonacci数字打印到给定的数字。这是一个递归函数,用于:
function fib_r
{
local -r n=$1
local -r depth=${2-1}
local -r f1=${3-1}
local -r f2=${4-0}
if (( depth <= n )); then
printf '%2d %d\n' "$depth" "$f1"
fib_r "$n" "$((depth+1))" "$((f1+f2))" "$f1"
fi
return 0
}这使用了一个更有效的算法(O(n)),因此它可以计算出所有的斐波那契数,这些数字可以在一秒钟内用64位整数表示。运行fib_r 92就可以做到这一点。
https://stackoverflow.com/questions/72228033
复制相似问题