Lispでの階乗の書き方

LispなんてどうでもいいけどLispの階乗のコードがどうなっているか理解したい人向けのページです.

まずLispでの階乗はこう書きます.(3の階乗)

(defun fact(n)
    (if (= n 0)
        1
        (* n (fact (- n 1)))))
(fact 3)

これをCで書くと

int fact(int n)
{
    int ret;
    if (n == 0) ret = 1;
    else ret = n * fact(n - 1);

    return ret;
}

int main(void)
{
    printf("%d\n",fact(3));
    return 0;
}

こうなります.

Lispのdefunでfactという関数を作って,その中身がifになっています. Lispは最後に評価した式の値を返すのでnが0のときには1が,そうではないときには(n * fact(n-1))が返ります.

なのでCのfactをもう少しLispっぽくすると

int fact(int n)
{
    return ((n == 0) ? 1 : (n * (fact (n - 1))));
}

みたいな感じですね.

Tweet