Re: Если интересно, решение на прологе
От: xonixx  
Дата: 26.01.08 18:29
Оценка:
:- dynamic saved/3, len_saved/2, max_saved/1.

f(N, R) :-
    (   0 is N mod 2
    ->  R is N//2
    ;   R is 3 * N + 1
    ).

len(1, 1) :-!.
len(N, L) :-
    len_saved(N, L), !;
    f(N, R),
    len(R, L1),
    L is L1 + 1
    .

save_all_lens :-
    retractall(len_saved(_, _)),
    save_len(1).

save_len(N) :-
    N =< 1000000,
    log(N),
    len(N, L),
    asserta(len_saved(N, L)),
    Nnext is N + 1,
    save_len(Nnext).

log(N) :-
    (   0 is N mod 10000
    ->  write(N),nl
    ;   true
    ).

:- asserta(max_saved(1,1)).
max1 :-
    len_saved(N, L),
    log(N),
    max_saved(_, M),
    (   M < L
    ->  retractall(max_saved(_, _)),
        asserta(max_saved(N, L))
    ),
    fail.
max1 :-
    write('Max: '),max_saved(Nm, M), write(Nm),write(' '),write(M).

do :-
    (   save_all_lens; true),
    max1.

Работает 18 сек. Решение почти в лоб. К стати, интересно, почему пролог так не популярен, хотя он явно проще хаскелла? )
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.