Prologでの階乗の書き方

Prologでの階乗のやり方が気になったので調べて,ついでにC言語で書き換えてみました.

fact(0, 1).
fact(X, Y):- X>0, X1 is X-1, fact(X1, Y1), Y is X * Y1.

% ?- fact(3,X).

これをC言語でそれっぽく書き換えるとこうなります.

#include <stdio.h>

int fact(int X, int Y) {
    if (X == 0 && Y == 1) 
        return 1;

    if (X > 0) {
        int X1 = X - 1;
        int Y1 = fact(X1, 1);
        Y = X * Y1;
    }
    return Y;
}

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

Prologの変数の扱い方が特殊なのでそのままC言語に書き直すのは難しそうですね.

やってることとしては,X1を1ずつ減らしながら再帰呼び出しをしていき,X1が0かつY1が1になったところで,Prologのコード一行目の事実と合致するのでそこからYを使って数を1から順にかけて答えを出しています.

Tweet