Recursive Fibonacci in Bash script

前端 未结 5 1352
名媛妹妹
名媛妹妹 2020-12-20 06:44

This is my attempt:

#!/bin/bash

function fibonacci(){

first=$1
second=$2

if (( first <= second ))
then
return 1

else 

return $(fibonacci $((first-1))         


        
相关标签:
5条回答
  • 2020-12-20 07:13

    Short version, recursive

    fib(){(($1<2))&&echo $1||echo $(($(fib $(($1-1)))+$(fib $(($1-2)))));}
    
    0 讨论(0)
  • 2020-12-20 07:14

    The $(...) substitution operator is replaced with the output of the command. Your function doesn't produce any output, so $(...) is the empty string.

    Return values of a function go into $? just like exit codes of an external command.

    So you need to either produce some output (make the function echo its result instead of returning it) or use $? after each call to get the value. I'd pick the echo.

    0 讨论(0)
  • 2020-12-20 07:23

    While calculating fibonacci numbers with recursion is certainly possible, it has a terrible performance. A real bad example of the use of recursion: For every (sub) fibonacci number, two more fibonacci numbers must be calculated.

    A much faster, and simple approach uses iteration, as can be found here:

    https://stackoverflow.com/a/56136909/1516636

    0 讨论(0)
  • 2020-12-20 07:31

    As Wumpus said you need to produce output using for example echo. However you also need to fix the recursive invocation. The outermost operation would be an addition, that is you want:

    echo $(( a + b ))
    

    Both a and b are substitutions of fibonacci, so

    echo $(( $(fibonacci x) + $(fibonacci y) ))
    

    x and y are in turn arithmetic expressions, so each needs its own $(( )), giving:

    echo $(( $(fibonacci $((first-1)) ) + $(fibonacci $((second-2)) ) ))
    

    If you are confused by this, you should put the components into temporary variables and break down the expression into parts.

    As to the actual fibonacci, it's not clear why you are passing 2 arguments.

    0 讨论(0)
  • 2020-12-20 07:32
    #!/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
    
    0 讨论(0)
提交回复
热议问题