对于给定值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:~>
不确定我哪里出错了。任何帮助将不胜感激。
答案 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";