StandardML 阶乘评估在 Poly/ML 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;
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;

想知道是什么导致了这种情况??

解决方法

n * fact n-1n * (fact n) - 1 相同 - 因此,n 永远不会减少,并且您的代码最终会一遍又一遍地调用 fact 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
       ~> ...