введите число и рекурсивно выведите число Фибоначчи Perl

Для заданного значения N я пытаюсь вывести соответствующее число Фибоначчи F(N). Мой сценарий, похоже, не входит в рекурсивную стадию. fibonnaci($number) не вызывает подпрограмму. Он просто выводит «фибоначчи (любое введенное число)».

Вот мой код:

 #!/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";

Пример вывода:

    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:~>

Не знаю, где я ошибся. Любая помощь будет принята с благодарностью.


person chomp    schedule 06.11.2014    source источник
comment
Вы неправильно работаете с параметром подпрограммы. Вам нужна строка типа my ($number) = @_; в качестве первой строки в fibonacci.   -  person ooga    schedule 06.11.2014
comment
Я ценю ответ. На самом деле я получаю те же результаты, даже когда добавляю эту строку. Любые идеи? @уга   -  person chomp    schedule 06.11.2014
comment
Это ваша print линия. Вынесите вызов функции из кавычек. print "\n$number: ", fibonacci($number), "\n";   -  person ooga    schedule 06.11.2014
comment
Вы можете использовать запоминание, чтобы сделать это еще быстрее. perldoc.perl.org/Memoize.html   -  person xtreak    schedule 06.11.2014


Ответы (3)


Вам нужно правильно принять аргументы функции и вывести вызов функции из кавычек.

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";

Более эффективная, но все же рекурсивная версия:

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";
person ooga    schedule 06.11.2014
comment
Для вашего первого примера он выводит неправильно для меня. Для F(4) я получаю 3. F(5)=5, F(10)=55....@ooga - person chomp; 06.11.2014
comment
В моем случае, если N=0 или N=1, число Фибоначчи должно быть равно 1. Вот где была неразбериха. Починил это. Спасибо за помощь! @уга - person chomp; 06.11.2014

В других ответах уже упоминалось об отсутствии правильного аргумента для функции fibonacci и о том, что вы не можете интерполировать вызов функции в строке print таким образом. В последнее время мой любимый способ интерполировать вызовы функций в строки печати — использовать нотацию ${\ ... } для встраивания произвольных выражений в строки:

print "f($number) = ${\ fibonacci($number) }\n";

Другие методы включают отдельные аргументы:

print "f($number) = ", fibonacci($number), "\n";

или вспомогательная переменная:

my $result = fibonacci($number);
print "f($number) = $result\n";

или даже printf:

printf "f(%d) = %d\n", $number, fibonacci($number);

Из всех этих методов я склонен предпочесть любой из первых двух, потому что они приводят к тому, что выражения помещаются «в линию» с остальной частью текстовой строки, тогда как в последних двух они располагаются в другом месте, что затрудняет их просмотр. посмотрите, что и где печатается. Особенно с позиционными аргументами printf может быть легко ошибиться с большим количеством аргументов и поместить все не в то место.

person LeoNerd    schedule 06.11.2014

Вы неправильно печатаете. вам просто нужно обработать возвращаемое значение. Кроме того, то, как вы используете номер в подразделе, также не имеет значения. Я обновил и все работает нормально.

Также значения, которые вы хотите напечатать, зависят от запуска серии. хотите ли вы начать с 0 или 1. Пример серии начинается с 1: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, поэтому, если вы поставите 10, вы получите 55.

#!/usr/bin/perl -w

use warnings;
use strict;


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


chomp($number);
my $result=fibonacci($number);

sub fibonacci
{
my $f =0;
if ($_[0] == 1 ) { # base case 
      $f = 1;
   } elsif ( $_[0] == 2 ) {
      $f = 1;
   } else {                                # recursive step
      $f= fibonacci( $_[0] - 1 ) + fibonacci( $_[0] - 2 );
    }
    return $f;
}


print "\nf($number) = $result\n";
person Community    schedule 06.11.2014