среда, 1 декабря 2010 г.

higher-order perl

читаю давеча subj и в главе 5.4 вижу следующий кусок кода:

sub fib
{
  my $n = shift;
  my($s1,$s2,$return);
  while(1)
  {
    if ( $n < 2 ) {
      return $n;
    } else {
      if ( $BRANCH == 0 ) {
        $return = fib($n-2);
      } elsif ( $BRANCH == 1 ) {
        $s1 = $return;
        $return = fib($n-1);
      } elsif ( $BRANCH == 2 ) {
        $s2 = $return;
        $return = $s1 + $s2;
      }
    }
  }
}

но ведь это же не работает ни разу, потому что переменная $BRANCH при любом вызове равна нулю ! wtf ?
И самое главное - зачем это все, если можно обойтись без рекурсии вот примерно так:

sub fib
{
  my $n = shift;
  my $f1 = 0;
  my $f2 = 1;
  return 1 if ( $n < 2 );
  my $tmp;
  for ( my $i = 1; $i < $n; $i++ )
  {
    $tmp = $f2 + $f1;
    $f2 = $f1;
    $f1 = $tmp;
  }
  return $f1 + $f2;
}

Комментариев нет:

Отправить комментарий