生成斐波那契数列的 Shell 脚本

2024-06-21

我正在尝试创建一个递归函数来计算斐波那契系列中的第 n 个数字。我已经找到了很多解决这个问题的方法,但我不知道为什么我的解决方案不起作用。谢谢。

function fib ()
{
        if [ $1 -eq 1 -o $1 -eq 2 ]
        then
                return 1
        else
               let nr=$1-1
               fib $nr
               rez1=$?
               let nr=$1-2
               fib $nr
               rez2=$?
               let rez=$rez1+$rez2
               return $rez
        fi
}

这里有两个问题。首先,所有变量都是全局变量,这意味着当您进行递归调用时,它会覆盖nr, rez, rez1, and rez2。您可以通过将它们声明为来解决此问题local:

fib() {
    local nr rez rez1 rez2
    if [ $1 -eq 1 -o $1 -eq 2 ]; then
        return 1
    else
        let nr=$1-1
        fib $nr
        rez1=$?
        let nr=$1-2
        fib $nr
        rez2=$?
        let rez=$rez1+$rez2
        return $rez
    fi
}

第二个问题是您试图通过函数的返回状态传递一个数字。返回状态是一个 1 字节无符号整数,这意味着它不能大于 255(之后它回绕到 0。它的真正目的是给出成功/失败结果(也许还有一些有关失败的信息), 0 表示成功,其他任何内容表示错误。尝试将其用于其他用途是自找麻烦。您可以在此处查看结果(来自local函数的简化版本):

$ fib 11; echo $?
89
$ fib 12; echo $?
144
$ fib 13; echo $?
233
$ fib 14; echo $?
121

第 14 个斐波那契数是 377,但超过了 255,因此结果为 377-256 = 121。要解决此问题,请通过以下方式返回结果echo将其发送到标准输出并捕获它$( ):

fib() { 
    local nr rez rez1 rez2
    if [ $1 -eq 1 -o $1 -eq 2 ]; then
        echo 1
    else
        let nr=$1-1
        rez1=$(fib $nr)
        let nr=$1-2
        rez2=$(fib $nr)
        let rez=$rez1+$rez2
        echo $rez
    fi
}

...不过,这确实有一个缺点:速度慢得多,因为每次调用fib必须作为子进程运行,并且创建子进程的计算成本很高。 (这实际上可以解决全局变量问题,因为变量向下继承到子流程,而不是向上继承;但这只是偶然解决的。)

重要教训:shell 脚本不是适合此类事情的语言。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成斐波那契数列的 Shell 脚本 的相关文章

  • Bash:单行命令以与 grep 命令相反的状态退出?

    如何减少以下 bash 脚本 grep P STATUS Perfect recess txt exit 1 exit 0 看起来我应该能够用一个命令来完成它 但我这里总共有 3 个命令 我的程序应该 阅读课间休息 txt 如果它包含 ST
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它
  • 在 Bash 中监控 tomcat,直到它完成部署 war 或应用程序

    怎么可能Tomcat在 bash 脚本中进行监控以检测它是否完成了战争或应用程序的部署 应用场景 Tomcat 开始于systemd Tomcat 开始于catalina sh 使用 Tomcat 管理器 Tomcat从Eclipse启动
  • 将 stdout 复制到 stderr

    我希望在 bash 下也将命令的标准输出复制到标准错误 就像是 echo FooBar FooBar FooBar 其中 是重定向表达式 那可能吗 将 tee 与 dev stderr 一起使用 echo FooBar tee dev st
  • Bash 循环遍历具有行和列的变量

    经过几个小时的搜索测试不同的解决方案后 我尚未找到可行的解决方案 Bash 和 Shell 脚本不是我的强项 我有一个变量 其中有行 换行 和列 制表符分隔 我想要做的是循环遍历行并获取 Column X 然后将该项目放入变量中 以便我可以
  • 启动 OSX 时未使用 teamcity 代理运行 bash

    我有一个 shell 脚本startup sh执行以下操作 创建 RAM 磁盘并启动 teamcity 代理 bin bash DISK usr bin hdiutil attach nobrowse nomount ram 1677721
  • bash:使用 scp 检查远程文件是否存在

    我正在编写一个 bash 脚本来将文件从远程服务器复制到本地计算机 我需要检查该文件是否可用 以便在该文件不存在时可以采取替代操作 我知道如何测试本地文件是否存在 但是 使用 scp 会使事情变得有点复杂 常识告诉我 一种方法是无论如何尝试
  • 为什么 sed 不将 \t 识别为制表符?

    sed s t 1 filename gt sedTmpFile mv sedTmpFile filename 我期待这个sed脚本插入一个tab在每一行前面 filename然而事实并非如此 由于某种原因 它正在插入一个t反而 Not a
  • 错误:分配关联数组时必须使用下标

    我想要 bash 中的哈希图等效项 键为string和价值观作为list的整数 所以 我写了下面的代码 declare A PUBS PUBS FEE 345 342 FOO 1 2 44 BAR 23 67 但是 我收到一条错误消息mus
  • 在同一变量集行中组合多个 bash 参数替换,而不使用任何其他命令[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想要组合的示例 sVar whoami sVar sVar sVar sVar 1 Output 用户名第一个字符大写 要求 单线
  • 如何在 Bash 脚本中回答“是”

    有一个快速的问题 想象一下我有这样的代码 mkdir p INSTALLDIR sudo apt get install y git clojure leiningen git clone git github com maltoe sto
  • cron 作业不适用于 xwindow

    我在 crontab 中有以下行 1 xeyes 它不显示任何 xwindow 但相反 1 touch somefile txt 工作正常 尝试在谷歌上搜索但没有得到任何具体答案 如果您运行的命令使用 X 服务器 您必须告诉 cron 在哪
  • Bash 脚本在 for 循环中使用 sed 和变量?

    我正在尝试编写一个 bash 脚本 该脚本需要一些变量 然后使用 grep 对给定文件搜索进行查找 替换 以获取包含该字符串的文件列表 我认为我遇到的问题是在 sed 中看到变量我不确定它可能是什么 if searchFiles a old
  • 为什么我不能用这个循环从 bash 历史记录中删除多个条目

    这个循环将显示我想要做的事情 但是如果我删除echo从中 它实际上不会删除任何内容 history grep 0 5 0 9 ls cut c1 5 while read id do echo history d id done 我添加了缩
  • 在詹金斯管道作业中将变量传递给bash脚本

    我有一个 Jenkins 管道作业 其中我使用名为 setup sh 的 bash 脚本配置我的环境 如下所示 bin bash export ARCH 1 echo architecture ARCH 在 Jenkins 管道脚本中 我使
  • 如何在每个 xargs 命令之间休眠 1 秒?

    例如 如果我执行 ps aux awk print 1 xargs I echo 我想让 shell 在每次之间休眠 1 秒echo 如何更改我的 shell 命令 您可以使用以下语法 ps aux awk print 1 xargs I
  • 将匹配的值传递给函数,并替换为返回值

    我如何让 Bash 匹配正则表达式 而不是用常量字符串替换值 而是将匹配的值传递给函数 然后从函数的返回值中获取要替换的值 像下面的伪代码一样 它替换了每一个匹配项 a d 具有相同的字符 但大写 function uppercase ec
  • 寻找 shell 重定向交错行为的解释

    给定以下脚本 t sh bin bash if eq 0 then log if gt 0 then printf s n else cat fi tee a logged out else log if gt 0 then printf
  • 使用环境变量将参数传递给命令

    我正在尝试编写一个 bash 脚本 该脚本采用环境变量并将其传递给命令 所以如果我有类似的东西 export OUT a arg1 b arg2 0 arg2 1 我想在我的 bash 脚本中执行以下操作
  • 疯狂的 crond 行为。不断使 bash 进程失效

    我有一个看起来像这样的 crontab SHELL bin bash PATH sbin bin usr sbin usr bin MAILTO root HOME 0 59 var www html private fivemin zda

随机推荐