Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/prolog/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog中的递归_Prolog - Fatal编程技术网

Prolog中的递归

Prolog中的递归,prolog,Prolog,我将在Prolog中创建一个程序,该程序将从递归中返回值列表: f(1) = 3, f(2) = 2, f(n) = f(n-1) * f(n-2) 例如 我尝试使用以下方法解决此问题: rekur(2,[3,2]). rekur(X,[H|T,M]):- X1 is X-1, rekur(X1,[H1,T1,M1], H1 is T*M. 这被证明是完全错误的。你能演示一下这个例子的解决方案吗?非常感谢您的解释。我发现我不知道Prolog是如何工作的。感谢您的帮助。一个主要问题可能是[H

我将在Prolog中创建一个程序,该程序将从递归中返回值列表:

f(1) = 3, f(2) = 2, f(n) = f(n-1) * f(n-2)
例如

我尝试使用以下方法解决此问题:

rekur(2,[3,2]).
rekur(X,[H|T,M]):- X1 is X-1, rekur(X1,[H1,T1,M1], H1 is T*M.

这被证明是完全错误的。你能演示一下这个例子的解决方案吗?非常感谢您的解释。我发现我不知道Prolog是如何工作的。感谢您的帮助。

一个主要问题可能是
[H | T,M]
不是有效的列表。事实上,Prolog中的列表看起来像大多数程序员考虑的链表:它是一个元组,包含对元素的引用(称为头)和对下一元组的引用(称为尾部)。有一个特殊的列表
[]
,表示列表结束
[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).
rekur(北、北):-
雷库尔(北,3,2,L)。
雷库尔(N,,,[]):-
n0,
C是A*B,
N1是N-1,
雷库尔(N1,B,C,T)。

[H | T,M]
没有意义,如果您试图显示至少包含两个元素的列表
X
Y
,以及“rest”
T
,则可能应该是
[X,Y | T]
。您的代码中至少还有一个其他输入错误(在
rekur
调用中缺少右括号)。你能用你试过的代码更新你的问题吗?
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).