Я с трудом понимая код, но я думаю, что ваша проблема - вы пытаетесь сделать ей довольно тяжелый вес своего рода способ, но главное - вы не на самом деле «разматывая» хвост вашей рекурсии.
Точка рекурсивного алгоритма - это пересечение глубины, но сопоставление результатов.
Так что я бы подойти к вашей проблеме, как это:
#!/usr/bin/env perl
use strict;
use warnings;
my $str = 'abcde';
sub combinations {
my ($string) = @_;
print "Starting combinations with \"$string\"\n";
if (length($string) == 1) {
return ($string);
}
my @combinations;
for my $index (0 .. length($string) - 1) {
my @chars = split(//, $string);
my $firstletter = splice(@chars, $index, 1);
print "Keeping: $firstletter combining @chars\n";
foreach my $combination (combinations(join("", @chars))) {
print "Got for @chars $combination\n";
push(@combinations, $firstletter . $combination);
}
}
return (@combinations);
}
print join("\n", combinations($str));
У нас есть рекурсивная процедура, которая «данное» строки. Он выполняет итерацию каждой буквы в этой строке - выбирая «первую букву» и передавая оставшиеся буквы рекурсивному вызову, чтобы сделать то же самое.
Но тогда он «склеивает вместе» результаты вызова, чтобы составить список «результатов» - поскольку каждый «уровень» вызова должен генерировать ряд ответов, которые затем возвращаются к более высоким уровень вызова и т.д.
Примечание - Я также:
- включил
strict
и warnings
- что очень важно при написании кода.
- не используется префикс
&
в подзаголовках. Это редко то, что вы хотите делать.
- не указан
$_[0]
- в качестве точки стиля следует избегать использования неявных переменных явно не более, чем необходимо. Назовите свои аргументы и дайте им имена, в которых ясно, что происходит.
Что вы хотите сказать? – simbabque
И каков ожидаемый результат? – Sobrique
Отсутствует 'use strict; используйте предупреждения; ', не называйте subs с' & ', избегайте глобальных переменных. – melpomene