首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试在Bash中调用函数,但它返回错误

尝试在Bash中调用函数,但它返回错误
EN

Stack Overflow用户
提问于 2022-05-13 10:23:14
回答 1查看 57关注 0票数 1

我看到了溢出和交换,但我似乎找不到答案。我目前正在尝试创建一个递归fibonacci函数。但是,当我尝试测试它(使用命令行条目)时,它一直返回错误。

fork: retry: Resource temporarily unavailable

我发现一篇文章说它与shell资源限制有关,但我觉得这可能不是我的问题,因为我看到了单独的帖子,递归函数能够很好地调用它们的函数。

我把操作分解成几个部分,看看到底发生了什么,但我找不到具体的问题--这可能与我调用函数的方式有关,但我也不确定。

不过,我可以很好地传递我想要的参数。它只对我输入的数字打印同样的错误。如果输入5,它会回显分叉错误5次。它返回,但不返回值..。

关于规范,我目前使用的是Bash版本4.4.20(1)

代码语言:javascript
复制
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
}

我想要实现的是,当您在命令行中输入一个数字时,它确实计算了这个数字,但是它在每一步都显示了计算的数字,而不是从开始到结束返回最后的值:

一个示例输出:

代码语言:javascript
复制
1          1
2          1
3          2
4          3
5          5
6          8
7          13
8          21
9          34
10         55
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-13 12:35:44

这个谢尔查克-clean代码修复了问题中的代码中的一些问题:

代码语言:javascript
复制
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
}
  • 它为基本案例 (0和1)添加了停止递归的代码。原始代码没有基本情况,因此递归一直持续到资源耗尽为止。
  • 函数echo是结果,所以调用者可以使用它。命令替换 ($(command))通常只有当command将其结果输出到标准输出时才有用。
  • 循环被删除了,因为这应该是一个递归函数(并且循环没有用)。
  • local用于使变量成为函数的局部变量,这样它们就不会与使用该函数的程序中其他地方使用的变量发生冲突。使用-r (readonly)选项是因为变量不需要在函数中进行更改,并且可以防止其他函数意外地更改这些变量。
  • 变量名int被更改为n,因为对于这样的函数来说,这是比较传统的(对于熟悉C或相关编程语言的人来说,int看起来真的很奇怪)。

注意,这个函数非常慢。这部分是因为它使用命令替换(每次运行一个昂贵的子进程)来返回结果,但主要是因为这种特定的递归算法效率很低(参见Fibonacci序列的计算复杂性)。更快的递归实现是可能的。

问题被更新,以请求一个函数,该函数将所有Fibonacci数字打印到给定的数字。这是一个递归函数,用于:

代码语言:javascript
复制
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就可以做到这一点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72228033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档