括弧の難易度は高い

Schemeでプログラムを書いてみました。ただのテキストエディタで書くのは無理ですね。少なくとも自動インデントと括弧の対応表示は必須です。

SICPの問題を解いているのですけど、反復的アルゴリズムはループで書く方が慣れているので分かりやすいです。というか、Schemeで書くと違和感があります。

例えば問題1.17の再帰的なのは普通という印象。

(define (double n)
  (* n 2))

(define (halve n)
  (/ n 2))

(define (times a b)
  (cond ((= b 0) 0)
        ((even? b) (times (double a) (halve b)))
        (else (+ a (times a (- b 1))))))

それに引き替え問題1.18の反復的なのはループで書けばいいのにと思ってしまいます。

(define (double n)
  (* n 2))

(define (halve n)
  (/ n 2))

(define (times a b)
  (define (times-iter t a b)
    (cond ((= b 0) t)
          ((even? b) (times-iter t (double a) (halve b)))
          (else (times-iter (+ t a) a (- b 1)))))
  (times-iter 0 a b))

ちなみにPerlでループを使って書くとこんな感じ。

sub double {
    $_[0] * 2;
}

sub halve {
    $_[0] / 2;
}

sub multi {
    my $a = shift;
    my $b = shift;
    
    my $sum = 0;
    while ($b > 0) {
        if ($b % 2 == 0) {
	    $a = double($a);
	    $b = halve($b);
	} else {
	    $sum += $a;
	    $b--;
	}
    }
    
    return $sum;
}