use strict; use warnings; use Memoize; sub min { my $rv = shift; for my $tmp (@_) { $rv = $tmp if $tmp < $rv; } return $rv; } sub editDistance { my ($left, $lenLeft, $right, $lenRight) = map { $_, length($_) } @_; return $lenRight unless $lenLeft; return $lenLeft unless $lenRight; my $shortLeft = substr $left, 0, -1; my $shortRight = substr $right, 0, -1; return editDistance ($shortLeft, $shortRight) if substr($left, -1) eq substr($right, -1); return 1 + min( editDistance($left, $shortRight), #insert editDistance($shortLeft, $right), #remove editDistance($shortLeft, $shortRight) #replace ); } memoize("editDistance"); editDistance(...);