このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1258320456/222
#  2011年数学IIB第6問 
#  nを2以上の自然数とし、以下の操作を考える。 
#   (i)nが偶数ならば、nを2で割る。 
#   (ii)nが奇数ならば、nを3倍して1を加える。 
#  与えられた2以上の自然数にこの操作を行い、得られた自然数が1でなければ、 
#  得られた自然数にこの操作を繰り返す。2以上10の5乗以下の自然数から始めると、 
#  この操作を何回か繰り返すことで必ず1が得られることが確かめられている。 
#  たとえば、10から始めると 
#   10→5→16→8→4→2→1 
#  である。ただし、a→bは1回の操作で自然数aから自然数bが得られたことを意味する。 
#  Nを2以上10の5乗以下の自然数とするとき、F(N)をNから始めて1が得られるまでの 
#  上記の操作の回数と定義する。また、F(1)=0とおく。たとえば、上の例から、 
#  F(10)=6である。 
#  (1)F(6)=「ア」、F(11)=「イウ」である。 
#  (2)10の5乗以下の自然数Nについて、F(N)を求めるため、次のような「プログラム」を作った。 
#  ただし、INT(X)はXを超えない最大の整数を表す関数である。 


%
% python2_222.html と python2_222_1.html とし実行時間の差を計測しなさい。
% その差の原因は何か?
% 

'nを2以上の自然数とし、以下の操作を考える。 (i)nが偶数ならば、nを2で割る。 (ii)nが奇数ならば、nを3倍して1を加える。得られた自然数が1になるまで繰り返しその回数を計る'(_n,_回数),
        length(L,_n),
        all(L,1),
        得られた自然数が1になるまで繰り返しその回数を計る(L,X),
        length(X,_回数).

得られた自然数が1になるまで繰り返しその回数を計る([1],[]) :- !.
得られた自然数が1になるまで繰り返しその回数を計る(L,[_|X]) :-
        append(L1,L1,L),
        得られた自然数が1になるまで繰り返しその回数を計る(L1,X),!.
得られた自然数が1になるまで繰り返しその回数を計る(L,[_|X]) :-
        append(L,L,L2),
        append(L2,L,L3),
        得られた自然数が1になるまで繰り返しその回数を計る([1|L3],X).