Search code examples
perlrecursionscriptingscripting-language

input a number and output the Fibonacci number recursively Perl


For a given value N I am trying to output the corresponding Fibonacci number F(N). My script doesn't seem to enter the recursive stage. fibonnaci($number) is not calling the subroutine. It is simply outputing "fibonacci(whatever number is inputted)".

Here is my code:

 #!/usr/bin/perl -w

use warnings;
use strict;


print "Please enter value of N: ";
my $number = <STDIN>;


chomp($number);

sub fibonacci
{

my $f;
if ( $number == 0 ) { # base case
      $f = 0;
   } elsif ( $number == 1 ) {
      $f = 1;
   } else {                                # recursive step
      $f = fibonacci( $number - 1 ) + fibonacci( $number - 2 );
   }

   return $f;

}


print "\nf($number) = fibonacci($number)\n";

Sample Output:

    Please enter value of N: 4

f(4) = fibonacci(4)
user1:~>recursiveFib.pl
Please enter value of N: 5

f(5) = fibonacci(5)
user1:~>recursiveFib.pl
Please enter value of N: 10

f(10) = fibonacci(10)
user1:~>

Not sure where I went wrong. Any help would be greatly appreciated.


Solution

  • You need to accept the function arguments properly and take the function call out of the quotes.

    use warnings;
    use strict;
    
    sub fibonacci {
       my ($number) = @_;
       if ($number < 2) { # base case
          return $number;
       }
       return fibonacci($number-1) + fibonacci($number-2);
    }
    
    print "Please enter value of N: ";
    my $number = <STDIN>;
    chomp($number);
    print "\n$number: ", fibonacci($number), "\n";
    

    A more efficient but still recursive version:

    sub fib_r {
      my ($n,$a,$b) = @_;
      if ($n <= 0) { return $a; }
      else         { return fib_r($n-1, $b, $a+$b); }
    }
    
    sub fib { fib_r($_[0], 0, 1); }  # pass initial values of a and b
    
    print fib(10), "\n";