如何使用序言计算阶乘
How to calculate factorial using prolog
我有一个计算阶乘的代码如下:
fact(1,1).
fact(X,R):- X1 is X-1, fact(X1,R1), R is R1*X.
在我看来,这段代码不应该正常工作,但确实如此!我的理由是什么?我认为当我们调用 fact(3,R) 时,首先它会计算“X1 是 X1 -1”。然后进入下一条规则 fact(X1,R1)。这将再次调用目标部分,代码执行将 return 到目标“fact(X,R)”,这将一直持续到我们到达 fact(1, 1).这意味着它永远不会去
R 是 R1*X 部分。所以,看来我想错了。
谁能一步一步告诉我这段代码中的代码执行顺序?
谢谢
一旦我们 "reach" fact(1,1)
,它将 "return" 调用递归迭代并继续执行该迭代的 R is R1*X
部分, R1=1
.然后将 return 再次提升到上一级,依此类推。让我们看一个非平凡的迭代:
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)
次迭代的变量。没有 '
的变量用于最顶层迭代。
我有一个计算阶乘的代码如下:
fact(1,1).
fact(X,R):- X1 is X-1, fact(X1,R1), R is R1*X.
在我看来,这段代码不应该正常工作,但确实如此!我的理由是什么?我认为当我们调用 fact(3,R) 时,首先它会计算“X1 是 X1 -1”。然后进入下一条规则 fact(X1,R1)。这将再次调用目标部分,代码执行将 return 到目标“fact(X,R)”,这将一直持续到我们到达 fact(1, 1).这意味着它永远不会去 R 是 R1*X 部分。所以,看来我想错了。
谁能一步一步告诉我这段代码中的代码执行顺序? 谢谢
一旦我们 "reach" fact(1,1)
,它将 "return" 调用递归迭代并继续执行该迭代的 R is R1*X
部分, R1=1
.然后将 return 再次提升到上一级,依此类推。让我们看一个非平凡的迭代:
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)
次迭代的变量。没有 '
的变量用于最顶层迭代。