このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1263824755/786
#  【質問テンプレ】  
#  [1]プログラム演習   
#  [2]標準入力から入力した自然数を変数iに格納し i<(2のj乗)となる最小の自然数j 
#  を求める。ただし再帰関数を用いる。  
#  [3] Windows 7/Borland C++ 5.0/C言語  
#  [4] 3/1迄  
#   
#  再帰関数がよくわからないので分かり易いサイトなどあれば教えてください。  
#   

'標準入力から入力した自然数を変数iに格納し i<(2のj乗)となる最小の自然数jを求める'(_j) :-
        自然数を入力する(_i),
        'i < 2^jとなる最小の自然数j'(_i,_j).


'i < 2^jとなる最小の自然数j'(_i,_j) :-
        'i < 2^jとなる最大のj'(_i,_j1),
        _j is _j1 + 1.

'i < 2^jとなる最大のj'(0,0) :- !.
'i < 2^jとなる最大のj'(1,0) :- !.
'i < 2^jとなる最大のj'(N,M) :-
        偶数(N),
        N1 is N // 2,
        'i < 2^jとなる最大のj'(N1,M1),
        M is M1 + 1,!.
'i < 2^jとなる最大のj'(N,M) :-
        奇数(N),
        N1 is N - 1,
        'i < 2^jとなる最大のj'(N1,M).

自然数を入力する(_i) :-
        write('0より大きい自然数を入力してください : '),
        get_integer(_i),
        入力の診断(_i),!.
自然数を入力する(_i) :-
        自然数を入力してください(_i).

入力の診断(_i) :- _i > 0,!.
入力の診断(_i) :-
        write_formatted('%tは適切な自然数ではありません。再入力が必要です。\n',[_i]),
        fail.