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