このディレクトリの索引

# 出典 :: # 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_1.html と python2_222_2.html では実行時間にさらに大きな差が生じる。 % その原因は何か? % 'nを2以上の自然数とし、以下の操作を考える。 (i)nが偶数ならば、nを2で割る。 (ii)nが奇数ならば、nを3倍して1を加える。得られた自然数が1になるまで繰り返しその回数を計る'(_n,_回数) :- length(L,_n), 'Lの要素数が偶数ならば、Lの要素数を2で割る。 Lの要素数が奇数ならば、Lの要素数を3倍して1を加える。得られたLが1になるまで繰り返しその回数を計る'(L,X), length(X,_回数). 'Lの要素数が偶数ならば、Lの要素数を2で割る。 Lの要素数が奇数ならば、Lの要素数を3倍して1を加える。得られたLが1になるまで繰り返しその回数を計る'([_],[]) :- !. 'Lの要素数が偶数ならば、Lの要素数を2で割る。 Lの要素数が奇数ならば、Lの要素数を3倍して1を加える。得られたLが1になるまで繰り返しその回数を計る'(L,[_|X]) :- 'Lの要素数が偶数ならば、Lの要素数を2で割る'(L,X). 'Lの要素数が偶数ならば、Lの要素数を2で割る。 Lの要素数が奇数ならば、Lの要素数を3倍して1を加える。得られたLが1になるまで繰り返しその回数を計る'(L,[_|X]) :- 'Lの要素数が奇数ならば、Lの要素数を3倍して1を加える'(L,X). 'Lの要素数が偶数ならば、Lの要素数を2で割る'(L,X) :- 'Lの要素数が偶数ならば、Lの要素数を2で割る。乃ちならびを半分にする'(L,L1), 'Lの要素数が偶数ならば、Lの要素数を2で割る。 Lの要素数が奇数ならば、Lの要素数を3倍して1を加える。得られたLが1になるまで繰り返しその回数を計る'(L1,X). 'Lの要素数が偶数ならば、Lの要素数を2で割る。乃ちならびを半分にする'(L,L1) :- append(L1,L1,L). 'Lの要素数が奇数ならば、Lの要素数を3倍して1を加える'(L,X) :- 'Lの要素数が奇数ならば'(L), 'Lの要素数を3倍して1を加える'(L,L1), 'Lの要素数が偶数ならば、Lの要素数を2で割る。 Lの要素数が奇数ならば、Lの要素数を3倍して1を加える。得られたLが1になるまで繰り返しその回数を計る'(L1,X). 'Lの要素数が奇数ならば'(L) :- append([L1,L1,[_]],L). 'Lの要素数を3倍して1を加える'(L,L1) :- append([L,L,L,[_]],L1).