我即将在Prolog中创建程序,该程序返回重复的值列表:
f(1) = 3, f(2) = 2, f(n) = f(n-1) * f(n-2)
E.g
rekur(5, S). -> S = [3, 2, 6, 12, 72]
我试图用以下方法解决它:
rekur(2,[3,2]).
rekur(X,[H|T,M]):- X1 is X-1, rekur(X1,[H1,T1,M1], H1 is T*M.
这被证明是完全错误的。你能为这个例子演示解决方案吗?该解释非常感谢。我发现我不知道Prolog是如何工作的。谢谢你的帮助。
答案 0 :(得分:2)
一个主要问题可能是[H|T,M]
不是有效列表。事实上,Prolog中的列表看起来像大多数程序员认为的链表:它是一个元组,包含对元素的引用(称为 head )和对下一元组的引用(称为尾)。有一个特殊列表[]
,表示列表的结尾。 [3,2]
只是[3|[2|[]]]
的语法糖,实际上[](3,[](2,[]))
的格式很好。
由于这个链表概念,你不能(在语法上也不能在 O(1)上访问最后的元素)。
这就是为什么Prolog通常以相反的方式工作:你生成列表的头部,并通过使用递归,列表的其余部分被正确填充。对于rekur/2
子句,您可以使用两个累加器A
和B
以某种方式存储将在列表中发出的下一个元素。此外,您使用N
(要生成的列表的长度)作为循环计数器。例如:
rekur(N,L) :-
rekur(N,3,2,L).
rekur(N,_,_,[]) :-
N <= 0,
!.
rekur(N,A,B,[A|T]) :-
N > 0,
C is A*B,
N1 is N-1,
rekur(N1,B,C,T).