【问题标题】:How to calculate factorial using prolog如何使用prolog计算阶乘
【发布时间】:2015-05-30 02:08:58
【问题描述】:

我有一个计算阶乘的代码如下:

fact(1,1).
fact(X,R):- X1 is X-1, fact(X1,R1), R is R1*X.

在我看来,这段代码不应该正常工作,但确实可以!我的理由是什么?我认为当我们调用 fact(3,R) 时,首先它会计算“X1 is X1 -1”。然后进入下一条规则fact(X1,R1)。这将再次调用目标部分,代码执行将返回到目标“fact(X,R)”,这将一直持续到我们到达 fact(1,1)。这意味着它永远不会去 R 是 R1*X 部分。所以,看来我想错了。

谁能一步一步告诉我这段代码中的代码执行顺序? 谢谢

【问题讨论】:

  • fact(1,0) 不会终止。还有fact(1,1), false 循环,尽管它应该会失败。但是,fact(1,1) 会产生一个答案,从而引诱您进入一些安全状态。始终要求下一个答案,以确保您没有无限循环。

标签: prolog factorial


【解决方案1】:

一旦我们“到达”fact(1,1),它将“返回”到调用递归迭代,并使用R1=1 继续该迭代的R is R1*X 部分。然后将再次返回到先前的级别,依此类推。让我们看一个不平凡的迭代:

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(3,R) 编辑您的答案,因为这是我感到困惑的地方。我想知道当 2 到 3 为 X 时会发生什么!
  • fact(3,R) 中,第四行将匹配fact(2,R),这在答案中有所描述,因此返回R=2。其余的都是一样的
  • 我编辑了您的答案,以便其他用户可以逐步跟踪 fact(3,R)。但仍然无法理解最后一部分 R
  • 但是为什么在第 9 行,你写 R1=R'=2?怎么R1=R'?
  • 顶部迭代的 R1 与内部迭代的 R 匹配。
猜你喜欢
  • 1970-01-01
  • 2015-04-19
  • 2011-04-16
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多