【问题标题】:input a number and output the Fibonacci number recursively Perl输入一个数字并递归输出斐波那契数 Perl
【发布时间】:2015-01-02 11:19:49
【问题描述】:

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

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

【问题讨论】:

  • 您没有正确处理子程序参数。你需要像my ($number) = @_; 这样的行作为fibonacci 的第一行。
  • 感谢您的回复。即使我添加了那行,我实际上仍然得到相同的结果。有任何想法吗? @ooga
  • 这是您的print 行。从引号中取出函数调用。 print "\n$number: ", fibonacci($number), "\n";
  • 您可以使用 memoization 使其更快。 perldoc.perl.org/Memoize.html

标签: perl recursion scripting scripting-language


【解决方案1】:

您需要正确接受函数参数并将函数调用从引号中取出。

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

【讨论】:

  • 对于您的第一个示例,它对我来说输出错误。对于 F(4),我得到 3。F(5)=5, F(10)=55....@ooga
  • 在我的例子中,如果 N=0 或 N=1,斐波那契数应该是 1。这就是问题所在。修复。谢谢您的帮助! @ooga
【解决方案2】:

其他答案已经提到缺少正确地将参数传递给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 的位置参数,很容易与大量参数“一刀两断”,把所有东西都放在错误的位置。

【讨论】:

    【解决方案3】:

    您以错误的方式打印。你只需要处理返回值。此外,您在 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";
    

    【讨论】:

      猜你喜欢
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 2021-12-01
      • 2012-11-19
      • 2016-11-07
      相关资源
      最近更新 更多