我有一个计算阶乘的代码如下:
fact(1,1).
fact(X,R):- X1 is X-1, fact(X1,R1), R is R1*X.
在我看来,这段代码应该不能正常工作,但确实如此!我的理由是什么?我想当我们称事实(3,R)时,首先计算“ X1是X1 -1 ”。然后它进入下一个规则事实(X1,R1)。这将再次调用目标部分,代码执行将返回目标“ fact(X,R)”,这将持续到我们达到事实(1,1)。这意味着它永远不会去 R是R1 * X 部分。所以,我觉得我错了。
有人可以一步一步地告诉我这段代码中的代码执行顺序吗? 感谢
答案 0 :(得分:1)
一旦我们“到达”fact(1,1)
,它将“返回”到调用的递归迭代,并使用R is 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.
此处带'
的变量表示与fact(2,R)
迭代对应的变量。没有'
的变量用于最顶层的迭代。