2014-11-06 63 views
1

对于给定值N,我试图输出相应的斐波那契数字F(N)。我的脚本似乎没有进入递归阶段。 fibonnaci($ number)不调用子程序。它只是输出“斐波纳契(无论输入什么数字)”。输入数字并递归输出Fibonacci数字Perl

这里是我的代码:

#!/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:~> 

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

+0

你没有正确处理子程序参数。你需要一行像'my($ number)= @_;'作为'fibonacci'中的第一行。 – ooga 2014-11-06 03:40:48

+0

我很欣赏这种回应。即使添加该行,我仍然可以得到相同的结果。有任何想法吗? @ooga – chomp 2014-11-06 03:45:39

+0

这是你的'打印'行。从引号中取出函数调用。 'print'\ n $ number:“,斐波那契($ number),”\ n“;' – ooga 2014-11-06 03:52:39

回答

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

对于你的第一个例子,它对我来说输出错误。对于F(4),我得到3. F(5)= 5,F(10)= 55 .... @ ooga – chomp 2014-11-06 04:07:13

+0

这听起来是对的。 – ooga 2014-11-06 04:10:03

+0

在我的情况下,如果N = 0或N = 1,斐波那契数应该是1.这就是混乱情况。修复。谢谢您的帮助! @ooga – chomp 2014-11-06 04:40:05

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"; 
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的立场上,可能很容易被大量的争论“脱序”,并把所有的东西都放在错误的地方。