2014-11-06 61 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的立場上,可能很容易被大量的爭論「脫序」,並把所有的東西都放在錯誤的地方。