Fibonacci序列子程序返回的值太高

时间:2012-06-11 22:33:56

标签: algorithm perl math recursion fibonacci

#!/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的参数指定。但是,它太高了。这与递归有关吗?

感谢。

3 个答案:

答案 0 :(得分:8)

20不是斐波纳契数。最接近的是21,第九。序列的第一个术语是

0 1 1 2 3 5 8 13 21

您的程序输出21,这是正确答案。

如果要计算第一个n斐波那契数的,则需要更新代码。现在你只是计算n斐波纳契数。如果你想要第一个n斐波纳契数的和,你应该用当前函数作为子程序来计算F(n + 2) - 1。

希望这有帮助!

答案 1 :(得分:6)

Fibonacci sequencef(0) = 0f(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