如何用prolog计算阶乘
我有一个计算阶乘的代码,如下所示:如何用prolog计算阶乘,prolog,factorial,Prolog,Factorial,我有一个计算阶乘的代码,如下所示: fact(1,1). fact(X,R):- X1 is X-1, fact(X1,R1), R is R1*X. 在我看来,这段代码不应该正常工作,但它确实如此!我的理由是什么?我认为当我们称事实为(3,R)时,首先它计算“X1是X1-1”。然后转到下一个规则事实(X1,R1)。这将再次调用目标部分,代码执行将返回到目标“事实(X,R)”,这将继续,直到我们到达事实(1,1)。这意味着它永远不会去 R是R1*X部分。看来我的想法是错的 有人能一步一步地告诉
fact(1,1).
fact(X,R):- X1 is X-1, fact(X1,R1), R is R1*X.
在我看来,这段代码不应该正常工作,但它确实如此!我的理由是什么?我认为当我们称事实为(3,R)时,首先它计算“X1是X1-1”。然后转到下一个规则事实(X1,R1)。这将再次调用目标部分,代码执行将返回到目标“事实(X,R)”,这将继续,直到我们到达事实(1,1)。这意味着它永远不会去
R是R1*X部分。看来我的想法是错的
有人能一步一步地告诉我这段代码中的代码执行顺序吗?
谢谢一旦我们“到达”了事实(1,1)
,它将“返回”到调用的递归迭代,并继续进行该迭代的部分R是R1*X
,其中R1=1
。然后将再次返回到上一级别,依此类推。让我们看一个非常重要的迭代:
fact(3,R) :
X <- 3,
X1 <- 3-1 = 2,
fact(2,R1) :
X' <- 2,
X1' <- 2-1 = 1,
fact(1, R1'), => R1'=1 (matched from fact(1,1))
R'<- R1' * X' = 2
R1 = R' = 2
R <- R1*X = 2*3 = 6.
事实(3,R):
X事实(1,0)
不终止。还有fact(1,1),false
循环,尽管它应该失败。然而,fact(1,1)
会给出一个答案,从而引诱你进入安全地带。总是问下一个答案,以确保你没有无限循环。请用事实(3,R)编辑你的答案,因为这是我感到困惑的地方。我想知道当2到3之间为X时会发生什么!在fact(3,R)
中,第四行将匹配fact(2,R)
,答案中描述了这一点,因此返回R=2
。剩下的是sameI编辑您的答案,以便其他用户可以一步一步地跟踪事实(3,R)。但是仍然不能理解最后一部分R,但是为什么在第9行中,你写R1=R'=2?R1=R'?顶部迭代的R1与内部迭代的R匹配。