【发布时间】:2015-08-18 17:51:07
【问题描述】:
我是 Prolog 的新手,我正在尝试编写一段代码来计算数字的阶乘。 此代码工作正常:
fact(0,1).
fact(N, R) :- N > 0, N1 is N - 1, fact(N1, R1), R is R1 * N.
但是这个没有:
fact(0, 1).
fact(N, R) :- N > 0, fact(N - 1, R1), R is R1 * N.
谁能解释一下?
【问题讨论】:
-
可以重写
fact\2的第二个版本,每次都评估它的第一个参数,并在第二个版本中解决这个问题,但更传统的做法是在第一个版本中做(通过前评估)。 Prolog 管理参数“惰性求值”的灵活性可能很有用,但阶乘计算过于简单,无法利用它。 -
一个挑战是将任一版本重写为尾递归(符合最后调用优化的条件)。通常需要引入一个额外的参数(例如
fact/3)来完成这项工作。