2012-06-30 3 views
1

EDIT : SOLVED. 아래의 솔루션을 참조하십시오.배열 참조가있는 Perl 피보나치 숫자 프로그램?

필자는 처음 10 개의 숫자에 대해 다음 피보나치 숫자 프로그램을 작성했습니다. 그러나 나는 그것을 작동시킬 수 없다. 그것은 계속 내게 말하기를 Use of uninitialized value $secondLast in addition (+) at fib.plx line 22.이며 영원히 계속됩니다. 나는 초급 Perl 프로그래머이므로 오류가 매우 간단하다고 확신한다. 감사.

#!/usr/bin/perl 
use warnings; 
use strict; 

sub fib(\@$); 

my @defaultNums = (1,1); 
my $max = 10; 
fib(@defaultNums,10); 

sub fib(\@$) 
{ 
     my $nums_ref = $_[0]; 
     my $max = $_[1]; 
     foreach(@{$nums_ref}) 
     { 
       print "$_, "; 
     } 
     print "\n"; 
     my $last = pop (@{$nums_ref}); 
     my $secondLast = pop (@{$nums_ref}); 
     my $sum = $last + $secondLast; 
     push (@{$nums_ref}, $sum); 
     if(scalar @{$nums_ref} >= $max) { return; } 
     fib (@{$nums_ref},$max); 
     print "\n"; 
} 

EDIT : SOLVED. 아래의 솔루션을 참조하십시오.

답변

6

몇 가지 참고 사항 :

  • 당신이 당신이 무엇을하고 있는지에 대한 절대적으로 확실하지 않으면 서브 루틴의 프로토 타입을 사용하지 않는 것이 중요하다. 프로토 타입은 기본적으로 Perl 내장 연산자의 대체물을 작성하기위한 것이므로 거의 필요하지 않습니다. 명시 적으로 배열에 대한 참조를 전달하려면 fib(\@defaultNums, 10)이라는 호출을 작성해야합니다.

  • 피보나치 시퀀스의 처음 두 값은 0과 1입니다. 시퀀스가 두 번째 및 세 번째 값으로 채워졌지만 제대로 작동하지만 수학적으로 올바르지 않습니다.

  • Perl은 컨텍스트에 민감하기 때문에 scalar 호출을 제거하여 배열의 요소 수를 비교할 수 있습니다. 또한 많은 노이즈를 피하기 위해 if 문 수정자를 사용할 수 있으므로 return 행은 return if @{$nums_ref} >= $max이됩니다.

  • 선택한 솔루션 - 배열에서 튀어 나온 항목을 대체하려면 - 비효율적이며 반 직관적입니다. 리스트 할당과 Perl이 배열의 끝에서부터 배열 요소를 인덱싱하는 기능을 사용하면 요소를 제거하지 않고 대체 할 필요가없는 my ($last, $secondLast) = @{$nums_ref}[-1, -2]을 쓸 수 있습니다.

다음은 누락 된 항목을 빠르게 보여주는 프로그램입니다.

use strict; 
use warnings; 

my @defaultNums = (0, 1); 

fib(\@defaultNums, 10); 

sub fib { 

    my ($nums_ref, $max) = @_; 
    print join(', ', @$nums_ref), "\n"; 

    my ($last, $secondLast) = @{$nums_ref}[-1, -2]; 
    my $sum = $last + $secondLast; 
    push @$nums_ref, $sum; 
    return if @{$nums_ref} >= $max; 

    fib($nums_ref, $max); 
} 

출력

0, 1 
0, 1, 1 
0, 1, 1, 2 
0, 1, 1, 2, 3 
0, 1, 1, 2, 3, 5 
0, 1, 1, 2, 3, 5, 8 
0, 1, 1, 2, 3, 5, 8, 13 
0, 1, 1, 2, 3, 5, 8, 13, 21 
2

나는 내 실수를 알아 냈습니다. 매번 배열을 두 번씩 튀어 나오기 때문에 $ sum을 밀기 전에 그 숫자를 다시 기억해야합니다. 어쨌든 고마워. 프로그램에