katsu #5140(2008/01/03 10:06 GMT) [ Prolog ] Rating0/0=0.00
あけましておめでとうございます。 ぜんぜんprologらしくないのですみません。 cのループは、計算途中をassertaするために、あえて末尾再帰させていません。 結果: $ time pl -qs 120.pl 837799, 524 real 0m6.870s user 0m6.308s sys 0m0.551s
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
:-dynamic(ca/2). even(N):- 1 =:= N /\ 1. c(1,0):-!. c(N,R):-ca(N,R),!. c(N,R) :-!, (even(N)->N1 is N * 3 + 1; N1 is N / 2), c(N1,R0), succ(R0,R), asserta(ca(N,R)). max_c(M,M,MaxI,MaxF,(MaxI,MaxF)). max_c(I,M,MaxI,MaxF,R):-!, c(I,F), succ(I,I1), (MaxF < F -> max_c(I1,M,I,F,R) ; max_c(I1,M,MaxI,MaxF,R)). max_c(M,R):-max_c(1,M,0,0,R). :-N is integer(2^20) + 1, max_c(N,R), write(R), nl, halt.
Rating0/0=0.00-0+
[ reply ]
katsu
#5140()
[
Prolog
]
Rating0/0=0.00
:-dynamic(ca/2). even(N):- 1 =:= N /\ 1. c(1,0):-!. c(N,R):-ca(N,R),!. c(N,R) :-!, (even(N)->N1 is N * 3 + 1; N1 is N / 2), c(N1,R0), succ(R0,R), asserta(ca(N,R)). max_c(M,M,MaxI,MaxF,(MaxI,MaxF)). max_c(I,M,MaxI,MaxF,R):-!, c(I,F), succ(I,I1), (MaxF < F -> max_c(I1,M,I,F,R) ; max_c(I1,M,MaxI,MaxF,R)). max_c(M,R):-max_c(1,M,0,0,R). :-N is integer(2^20) + 1, max_c(N,R), write(R), nl, halt.Rating0/0=0.00-0+
[ reply ]