levenshtein_distance_rec.pl 727 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 12 December 2016
  5. # https://github.com/trizen
  6. # Levenshtein distance (recursive implementation).
  7. # See also:
  8. # https://en.wikipedia.org/wiki/Levenshtein_distance
  9. use 5.010;
  10. use strict;
  11. use warnings;
  12. use List::Util qw(min);
  13. use Memoize qw(memoize);
  14. memoize('leven');
  15. sub leven {
  16. my ($s, $t) = @_;
  17. return length($t) if $s eq '';
  18. return length($s) if $t eq '';
  19. my ($s1, $t1) = (substr($s, 1), substr($t, 1));
  20. (substr($s, 0, 1) eq substr($t, 0, 1))
  21. ? leven($s1, $t1)
  22. : min(
  23. leven($s1, $t1),
  24. leven($s, $t1),
  25. leven($s1, $t ),
  26. ) + 1;
  27. }
  28. say leven('rosettacode', 'raisethysword');