2
#!/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" 個の用語の合計を出力する必要があります。しかし、それは高すぎる。これは再帰と関係がありますか?

ありがとう。

4

3 に答える 3

8

20 はフィボナッチ数ではありません。最も近いのは 21 で、9 番目です。シーケンスの最初の項は次のとおりです。

0 1 1 2 3 5 8 13 21

あなたのプログラムは 21 を出力します。これがここでの正解です。

最初のフィボナッチ数の合計を計算する場合はn、コードを更新する必要があります。今、ちょうどnth 番目のフィボナッチ数を計算しています。n最初のフィボナッチ数の合計が必要な場合は、現在の関数をサブルーチンとして使用して F(n + 2) - 1 を計算する必要があります。

お役に立てれば!

于 2012-06-11T22:38:17.817 に答える
6

フィボナッチ数列f(0) = 0は とで始まりますf(1) = 1。その後、各フィボナッチ数は前の 2 つの合計になります。

関数はreturn (1) if ($num <= 1)which を誤って 1 として評価f(0)します。これを に変更すると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
于 2012-06-11T23:05:12.520 に答える
-1

templatetypedef はすでに質問に答えていますが、実装がひどいことを警告したいと思います。十分な時間があれば正しい答えが得られますが、数世紀待つことを気にしないのでなければ、フィボナッチ数列を別の方法で計算する必要があります。実際、計算するには2 回fib(n)呼び出します。これは、計算の複雑さが O(fib(n)) であることを意味します。O(n) の複雑さは非常に簡単に実現でき、O(Log(n)) の複雑さでさえ達成できます。Wikipediaを見てください。fibfib(n)

于 2012-06-11T23:10:45.880 に答える