#!/usr/bin/perl -w
use strict;
sub fib {
my($num) = @_; #give $num to input array
return(1) if ($num<=1); #termination condition
return($num = &fib($num-1) + &fib($num-2)); #should return sum of first "n" terms in the fibonacci sequence
}
print &fib(7)."\n"; #should output 20
此子程序应输出第一个“x”项的总和,由sub的参数指定。但是,它太高了。这与递归有关吗?
感谢。
答案 0 :(得分:8)
20不是斐波纳契数。最接近的是21,第九。序列的第一个术语是
0 1 1 2 3 5 8 13 21
您的程序输出21,这是正确答案。
如果要计算第一个n
斐波那契数的和,则需要更新代码。现在你只是计算n
斐波纳契数。如果你想要第一个n
斐波纳契数的和,你应该用当前函数作为子程序来计算F(n + 2) - 1。
希望这有帮助!
答案 1 :(得分:6)
Fibonacci sequence以f(0) = 0
和f(1) = 1
开头。之后,每个斐波纳契数都是前两个的总和。
您的函数使用return (1) if ($num <= 1)
错误地将f(0)
评估为1.如果将其更改为return $num if $num <= 1
,那么您的序列将正确启动。
此代码输出系列中的前11个数字。
use strict;
use warnings;
sub fib {
my ($num) = @_;
if ($num <= 1) {
return $num;
}
else {
return fib($num-1) + fib($num-2);
}
}
print join ' ', map fib($_), 0 .. 10;
<强>输出强>
0 1 1 2 3 5 8 13 21 34 55
答案 2 :(得分:-1)
templatetypedef已经回答了这个问题,但我想警告你,你的实施很糟糕。如果你有足够的时间,它会给你正确的答案,但除非你不关心等待几个世纪,否则你应该以不同的方式计算斐波纳契数列。实际上,为了计算fib(n)
,您需要调用fib
两次,这意味着计算fib(n)
的复杂度为O(fib(n))。您可以非常简单地实现O(n)复杂度,甚至可以实现O(Log(n))复杂度,只需查看Wikipedia。