PI
Prologで作る数学の世界―Prologそして集合‐位相‐群の第3章の問題。arctanを定義してπの近似値を求めろ。最初に書いた効率の悪いやつもつけて
% 普通の再帰 atn(X, N, Sum) :- N > 0, (N mod 2 =:= 1 -> Sum1 is X ** (N * 2 - 1) / (N * 2 - 1) ; Sum1 is -X ** (N * 2 - 1) / (N * 2 - 1) ), N1 is N - 1, atn(X, N1, Sum2), Sum is Sum1 + Sum2, !. atn(_, 0, 0). % 末尾再帰 atn(X, N, Sum) :- atn_sub(X, N, Sum, 0), !. atn_sub(_, 0, Acc, Acc). atn_sub(X, N, Sum, Acc) :- An is X ** (N * 2 - 1) / (N * 2 -1), (N mod 2 =:= 1 -> Acc1 is Acc + An; Acc1 is Acc - An), N1 is N - 1, atn_sub(X, N1, Sum, Acc1). atn_pi(N,R) :- atn(1/5, N, Atn1), atn(1/239, N, Atn2), R is (Atn1 * 4 - Atn2) * 4.