我希望编写一个断言,为给定的N生成斐波那契数列。
fibon(6, X) -> X = [0,1,1,2,3,5].
我有一个生成斐波那契数列第N个元素的谓词:
fib(0, 0).
fib(1, 1).
fib(N, F) :-
N > 1,
N1 is N - 1,
N2 is N - 2,
fib(N1, F1),
fib(N2, F2),
F is F1 + F2.
我试图编写fibon/2函数,但它没有起作用:
fibon(N, [H|T]) :-
fib(N, H),
N1 is N - 1,
fibon(N1, T).
我解决它的方法如下:
at_the_end(X, [], [X]).
at_the_end(X, [H|T], [H|T2]) :-
at_the_end(X, T, T2).
revert([], []).
revert([H|T], Out) :-
revert(T, Out1),
at_the_end(H, Out1, Out).
fib(0, 0).
fib(1, 1).
fib(N, F) :-
N > 1,
N1 is N - 1,
N2 is N - 2,
fib(N1, F1),
fib(N2, F2),
F is F1 + F2.
fibon(0, [0]).
fibon(N, [H|T]) :-
fib(N, H),
N1 is N - 1,
fibon(N1, T).
fibonacci(In, Out) :-
fibon(In, Out1),
revert(Out1, Out).
fibon/2
的递归基是什么?如果N = 0
或者N < 0
会发生什么? - lurkerN > 0
条件,以避免因N
变成 < 0 而导致非终止问题。此外,你的基本情况可能应该是fibon(0, [])
,因为0
不是斐波那契数。如果你没有斐波那契数(0),那么你应该有一个空列表,对吗? - lurker