【发布时间】:2017-11-13 08:59:41
【问题描述】:
我想编写为给定 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? -
事实上,现在可以了。我会实现这个问题。
-
你真的应该在你的递归子句中有一个
N > 0条件,以避免由于N变为fibon(0, []),因为@987654331 @ 不是斐波那契数。如果您没有斐波那契数 (0),那么您应该有一个空列表,是吗?