このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/765
#  (1)c言語 
#  (2)問題:偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返すプログラムの作成をお願いします。 
#  「偶数なら2で割り、奇数なら3倍して1を足す」という部分を再帰関数化しろ。 
#  実行結果 
#  2以上の自然数を入力してください。 
#  11 
#  11→34→17→52→26→13→40→20→10→5→16→8→4→2→1 
#   

'偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す' :-
        2以上の自然数を入力(_自然数),
        '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(_自然数).

'偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(1) :-
        write('->1\n'),!.
'偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N) :-
        偶数(N),
        N2 is N // 2,
        writef('%t->',[N]),
        '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N2).
'偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N) :-
        奇数(N),
        N2 is N * 3 + 1,
        writef('%t->',[N]),
        '偶数なら2で割り、奇数なら3倍して1を足し、1になるまで繰り返す'(N2).

2以上の自然数を入力(_自然数) :-
        write('2以上の自然数を入力してください。\n'),
        get_line(Line),
        2以上の自然数を入力診断(Line,_自然数),!.
2以上の自然数を入力(_自然数) :-
        2以上の自然数を入力(_自然数).

2以上の自然数を入力診断(Line,_自然数) :-
        atom_to_term(Line,_自然数,_),
        integer(_自然数),
        _自然数 >= 2,!.
2以上の自然数を入力診断(Line,_自然数) :-
        writef('入力された%tからは2以上の自然数を得られません。再入力をお願いします\n',[Line]),
        fail.
偶数(N) :- 0 is N mod 2.

奇数(N) :- 1 is N mod 2.