0

以下阶乘函数很好......

Poly/ML 5.8.3 Development (Git version v5.8.2-297-g8185978a)
> fun fact 0 = 1
# | fact n = n * fact(n-1);
val fact = fn: int -> int
> fact 2;
val it = 2: int
>

但以下将 Poly REPL 带入无限循环。

Poly/ML 5.8.3 Development (Git version v5.8.2-297-g8185978a)
> fun fact 0 = 1
# | fact n = n * fact n-1;
val fact = fn: int -> int
> fact 2;

想知道这可能是什么原因造成的?

4

2 回答 2

3

n * fact n-1n * (fact n) - 1- 因此,n永远不会减少,并且您的代码最终会fact 2一遍又一遍地调用。

于 2021-07-02T18:39:52.110 回答
2

由于 ForceBru 已经给出了一个充分的答案,为了完成,这里是一个手动评估这个应该揭示无限递归的例子:

fact 2 ~> 2 * fact 2-1
       ~> 2 * (2 * fact 2-1)-1
       ~> 2 * (2 * (2 * fact 2-1)-1)-1
       ~> 2 * (2 * (2 * (2 * fact 2-1)-1)-1)-1
       ~> ...
于 2021-07-03T22:56:53.803 回答