このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1247438792/956
# [1] 授業単元: C言語課題
# [2] 問題文(含コード&リンク):
#
# 入力した値を n とし、階乗の逆数の和
# 1 + 1/1! + 1/2! + 1/3! + ...... + 1/n! と、
# ネピア数(M_E)との比を計算し、小数点以下第 6 位
# まで求めて表示しなさい。繰り返しは for 文を使わず
# while 文か do-while 文を利用して作成すること。 

:- dynamic(階乗保存計算/2).

'入力した値を n とし、階乗の逆数の和1 + 1/1! + 1/2! + 1/3! + ...... + 1/n! と、ネピア数(M_E)との比を計算し、小数点以下第 6 位まで求めて表示' :-
        '入力した値を n とし'(_n),
        階乗の逆数の和とネピア数との比(_n,_階乗の逆数和とネピア数との比),
        format('~6f\n',[_階乗の逆数和とネピア数との比]).

'入力した値を n とし'(_n) :-
        write('整数nを入力してください : '),
        get_integer(_n).

階乗の逆数の和とネピア数との比(_n,_階乗の逆数和とネピア数との比) :-
        階乗の逆数の和(_n,_階乗の逆数の和),
        _ネピア数 is exp(1),
        _階乗の逆数和とネピア数との比 is floor((_階乗の逆数の和 / _ネピア数) * 1000000.0 + 0.5) / 1000000.0.

階乗の逆数の和(N,X) :-
        階乗保存計算(N,K),
        階乗の逆数の和(1,N,K,Y),
        X is 1 + Y / K.

階乗の逆数の和(M,N,_,1) :- M > N,!.
階乗の逆数の和(M,N,K,X) :-
        階乗保存計算(M,U),
        Y is K // U,
        M2 is M + 1,
        階乗の逆数の和(M2,N,K,Z),
        X is Y + Z.

階乗保存計算(1,1) :- !.
階乗保存計算(N,X) :-
        N2 is N - 1,
        階乗保存計算(N2,Y),
        X is N * Y,
        asserta((階乗保存計算(N,X) :- !)).