【问题标题】:Find the index of a number in the fibonacci sequence在斐波那契数列中查找数字的索引
【发布时间】:2021-02-14 19:27:19
【问题描述】:

我想使用 recursion 找到斐波那契数列中数字的 索引

示例:13(我的输入)是斐波那契数列的第 8 个(输出)数

这是我的功能:

#!/bin/bash

function fib() {
    
number=1
cpt=1   
if [[ $number -lt $1 ]]
then
    compteur=$(($cpt+ 1))
    echo $(( $(fib $(($number - 1)) ) + $(fib $(($number - 2)) ) ))
fi
echo $cpt
}

fib $1

我有这个错误:+ 附近的符号错误

那我不知道我的算法逻辑好不好。我不知道我在 bash 中递归调用函数的语法是否很棒。

任何帮助将不胜感激。 谢谢

【问题讨论】:

  • 只是想知道,输入/斐波那契数 1 的预期输出/索引是多少?数字1 在斐波那契数列中出现两次。
  • 对,没想到^^我可能会做一个我认为返回2和3的语句
  • 无法复制。对于任何输入,代码都会输出2 1
  • @HugoSab 如果输入不是斐波那契数列的成员,你期望什么?
  • 如果数字在斐波那契数列中,我已经有一个返回我的脚本。最后,我希望我的脚本打印:数字在索引 [...] 处的斐波那契数列中

标签: bash shell recursion


【解决方案1】:

使用recursion,请尝试以下操作:

#!/bin/bash

# "fib n" returns the nth Fibonacci number (n starts from 0)
fib() {
    local n=$1
    if (( n == 0 )); then
        echo "0"
    elif (( n == 1 )); then
        echo "1"
    else
        echo "$(( $(fib "$(( n - 1 ))" ) + $(fib "$(( n - 2 ))" ) ))"
    fi
}

input=$1                        # user's input as a 1st argument to this script

for (( i = 0; ; i++ )); do      # increment the index i starting from 0
    f=$(fib i)
    (( f >= input)) && break    # if "fib i" >= input, then exit the loop
done

if (( f == input )); then       # the input is a Fibonacci number
    echo "$i"
else
    echo "$i (input $input is not a Fibonacci number.)"
fi

按照惯例,索引以“0”开头,然后 13 是第 7 个斐波那契数。
顺便说一句,如果您增加输入数字,您会看到脚本的执行需要一段时间(例如,请尝试使用 987 作为输入)。
这是一个没有递归的替代方案:

#!/bin/bash

f0=0
f1=1

input=$1

for (( i = 0; ; i++ )); do
    (( f0 >= input )) && break
    f2=$(( f1 + f0 ))
    f0=$f1
    f1=$f2
done

if (( f0 == input )); then
    echo "$i"
else
    echo "$i (input $input is not a Fibonacci number.)"
fi

虽然recursion 在数学上简单而优雅,但数字 计算量取决于实现。斐波那契数列是 需要考虑的典型例子。 第一个脚本包含两个问题:

  • 在第一次递归中,fib 函数调用了两个fib 函数。 在第二次递归中,调用了四个函数。计算次数 达到 O(2**N)。
  • fib(n-1) 和 fib(n-2) 等中间值被丢弃, 在下一次调用中再次计算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-18
    • 2015-06-05
    • 1970-01-01
    • 2013-08-03
    • 2014-05-19
    • 2015-08-30
    相关资源
    最近更新 更多