الگوریتم‌های کلاسیک

عدد اول، فاکتوریل، جستجو و فیبوناچی — به سبک پرل.

پرل + الگوریتم = لذت!

پرل برای پیاده‌سازی سریع الگوریتم‌ها فوق‌العاده است — کد کوتاه و واضح.

۱. تشخیص عدد اول

sub is_prime {
  my $n = shift;
  return 0 if $n < 2;
  foreach my $i (2..int(sqrt($n))) {
    return 0 if $n % $i == 0;
  }
  return 1;
}

foreach my $x (2..30) {
  print "$x " if is_prime($x);
}
print "\n";      { 2 3 5 7 11 13 17 19 23 29 }

۲. ب.م.م (GCD) با اقلیدس

sub gcd {
  my ($a, $b) = @_;
  while ($b != 0) {
    ($a, $b) = ($b, $a % $b);      { جابجایی پرلی! }
  }
  return $a;
}
say gcd(48, 36);      { 12 }

۳. جستجوی خطی

sub find_index {
  my ($target, @arr) = @_;
  foreach my $i (0..$#arr) {
    return $i if $arr[$i] == $target;
  }
  return -1;      { پیدا نشد }
}
say find_index(23, 5, 12, 23, 8);      { 2 }

۴. فیبوناچی با حلقه

sub fib_list {
  my ($n) = @_;
  my @fib = (0, 1);
  while (@fib < $n) {
    push @fib, $fib[-1] + $fib[-2];      { دو تا آخر! }
  }
  return @fib;
}
say join(" ", fib_list(10));      { 0 1 1 2 3 5 8 13 21 34 }
$fib[-1] و $fib[-2] آخرین و یکی‌مانده‌به‌آخرین عنصر — ایندکس منفی پرل!

۵. عدد آرمسترانگ

sub is_armstrong {
  my $n = shift;
  my $sum = 0;
  my $m = $n;
  while ($m > 0) {
    my $d = $m % 10;
    $sum += $d ** 3;
    $m = int($m / 10);
  }
  return $sum == $n;
}
say is_armstrong(153) ? "بله" : "نه";      { بله: 1³+5³+3³=153 }

۶. برعکس کردن عدد

sub reverse_num {
  my $n = shift;
  my $rev = 0;
  while ($n > 0) {
    $rev = $rev * 10 + ($n % 10);
    $n = int($n / 10);
  }
  return $rev;
}
say reverse_num(4527);      { 7254 }

خلاصه

این مبحث بخشی از دوره آموزش کامل پرل است.

ابزارهای مرتبط