我有那麼這裏工作的代碼:封裝遞歸函數在Perl
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %graph =(
F => ['B','C','E'],
A => ['B','C'],
D => ['B'],
C => ['A','E','F'],
E => ['C','F'],
B => ['A','E','F']
);
sub findPaths {
my($seen, $start, $end) = @_;
return [[$end]] if $start eq $end;
$seen->{ $start } = 1;
my @paths;
for my $node (@{ $graph{ $start } }) {
my %seen = %{$seen};
next if exists $seen{ $node };
push @paths, [ $start, @$_ ] for @{ findPaths(\%seen, $node, $end) };
}
return \@paths;
}
my $start = "B";
my $end = "E";
print "@$_\n" for @{ findPaths({}, $start, $end) };
我想要做的是創造一個更一般的子程序 所以,它只是需要\%graph, $start,$end
作爲輸入,並返回最後一個數組。
我試圖這樣做,但它不編譯。
sub findPathsAll {
my ($graph,$start,$end) = @_;
my $findPaths_sub;
$findPaths_sub {
my($seen) = @_;
return [[$end]] if $start eq $end;
$seen->{ $start } = 1;
my @paths;
for my $node (@{ $graph{ $start } }) {
my %seen = %{$seen};
next if exists $seen{ $node };
push @paths, [ $start, @$_ ] for @{ &$findPaths_sub(\%seen, $node, $end) };
}
return \@paths;
}
my @all;
push @all,@$_ for @{ &$findPaths_sub({}, $start, $end) };
return @all;
}
什麼是正確的做法?