Страницы

Превращение O→P

Убого:

MODULE Power;

 PROCEDURE Do*(x: REAL; n: INTEGER): REAL;
 VAR y: REAL; i: INTEGER;
 BEGIN
  ASSERT(n >= 0);

  y := 1.0; i := n;
  WHILE i > 0 DO
    IF ODD(i) THEN y := y*x END;
    x := x*x; i := i DIV 2
  END
 RETURN
  y
 END Do;

END Power.
Уже лучше:
sub power($x real, $n int) {
    assert $n < 0;
    
    var $y = 1.0;
    while ($n > 0) {
        $y *= $x if $n % 2;
        $x *= $x;
        $n = int($n / 2);
    }
    return $y;
}
Божественно:
use feature 'current_sub';
sub power{$_[1]?($_[1]%2?$_[0]:1)*__SUB__->($_[0]*$_[0],int $_[1]/2):1}

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

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