输入一个数字并递归输出Fibonacci数Perl

时间:2014-11-06 03:25:48

标签: perl recursion scripting scripting-language

对于给定值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:~>

不确定我哪里出错了。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分: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";

答案 1 :(得分:3)

其他答案已经提到缺乏正确地对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的位置参数,使用大量参数可以很容易地“一个接一个”,并将所有内容放在错误的位置。

答案 2 :(得分:0)

您正在以错误的方式打印。你只需要处理返回值。你在sub中使用Number的方式似乎也不相关。我已经更新了它的工作正常。

您想要打印的值也取决于系列的启动。是否要从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";