Почему моя рекурсивная функция Perl никогда не заканчивается? - PullRequest
0 голосов
/ 23 сентября 2010

Я пытаюсь написать следующую рекурсивную функцию. Проблема в том, что это никогда не заканчивается, и я не могу понять, почему:

    sub do_smth(@first, @second){
    my @tmp_first = @first;
    $tmp = shift(@tmp_first);
    if (@tmp_first > 0){
        do_smth(@tmp_first, @second);
    }
    my @tmp_second = @second;
    $tmp = shift(@tmp_second);
    if (@tmp_second > 0){
        do_smth(@first, @tmp_second);
    }

}

Ответы [ 2 ]

5 голосов
/ 23 сентября 2010

Этот код даже не компилируется.Без предупреждений и строгий вы получите эти ошибки:

Type of arg 1 to shift must be array (not scalar dereference) at so.pl line 5, near "$tmp_first)"
Type of arg 1 to shift must be array (not scalar dereference) at so.pl line 10, near "$tmp_second)"
Execution aborted due to compilation errors.

и с предупреждениями и строгий:

Illegal character in prototype for main::do_smth : @first,@second at so.pl line 4.
Global symbol "@first" requires explicit package name at so.pl line 5.
Global symbol "$tmp" requires explicit package name at so.pl line 6.
Global symbol "$tmp_first" requires explicit package name at so.pl line 6.
Type of arg 1 to shift must be array (not scalar dereference) at so.pl line 6, near "$tmp_first)"
Global symbol "@second" requires explicit package name at so.pl line 8.
Global symbol "@second" requires explicit package name at so.pl line 10.
Global symbol "$tmp" requires explicit package name at so.pl line 11.
Global symbol "$tmp_second" requires explicit package name at so.pl line 11.
Type of arg 1 to shift must be array (not scalar dereference) at so.pl line 11, near "$tmp_second)"
Global symbol "@first" requires explicit package name at so.pl line 13.
Execution aborted due to compilation errors.

Я не знаю, что вы пытаетесь сделать, но вот ваш кодправильный синтаксис:

use warnings;
use strict;

sub do_smth (\@\@);  # predeclaration needed since the prototyped sub
                     # is called recursively
sub do_smth (\@\@) {
    my ($first, $second) = @_;
    my @tmp_first = @$first;
    my $tmp = shift(@tmp_first);
    if (@tmp_first > 0){
        do_smth(@tmp_first, @$second);
    }
    my @tmp_second = @$second;
    $tmp = shift(@tmp_second);
    if (@tmp_second > 0){
        do_smth(@$first, @tmp_second);
    }
}
0 голосов
/ 23 сентября 2010

Вы перемещаете (неопределенные) скаляры $ tmp_first и $ tmp_second.

Больше не смотрел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...