56 lines
1.1 KiB
Prolog
56 lines
1.1 KiB
Prolog
:- dynamic fusc_cache/2.
|
|
|
|
fusc(0, 0):-!.
|
|
fusc(1, 1):-!.
|
|
fusc(N, F):-
|
|
fusc_cache(N, F),
|
|
!.
|
|
fusc(N, F):-
|
|
0 is N mod 2,
|
|
!,
|
|
M is N//2,
|
|
fusc(M, F),
|
|
assertz(fusc_cache(N, F)).
|
|
fusc(N, F):-
|
|
N1 is (N - 1)//2,
|
|
N2 is (N + 1)//2,
|
|
fusc(N1, F1),
|
|
fusc(N2, F2),
|
|
F is F1 + F2,
|
|
assertz(fusc_cache(N, F)).
|
|
|
|
print_fusc_sequence(N):-
|
|
writef('First %w fusc numbers:\n', [N]),
|
|
print_fusc_sequence(N, 0),
|
|
nl.
|
|
|
|
print_fusc_sequence(N, M):-
|
|
M >= N,
|
|
!.
|
|
print_fusc_sequence(N, M):-
|
|
fusc(M, F),
|
|
writef('%w ', [F]),
|
|
M1 is M + 1,
|
|
print_fusc_sequence(N, M1).
|
|
|
|
print_max_fusc(N):-
|
|
writef('Fusc numbers up to %w that are longer than any previous one:\n', [N]),
|
|
print_max_fusc(N, 0, 0).
|
|
|
|
print_max_fusc(N, M, _):-
|
|
M >= N,
|
|
!.
|
|
print_max_fusc(N, M, Max):-
|
|
fusc(M, F),
|
|
(F >= Max ->
|
|
writef('n = %w, fusc(n) = %w\n', [M, F]), Max1 = max(10, Max * 10)
|
|
;
|
|
Max1 = Max
|
|
),
|
|
M1 is M + 1,
|
|
print_max_fusc(N, M1, Max1).
|
|
|
|
main:-
|
|
print_fusc_sequence(61),
|
|
print_max_fusc(1000000).
|