问题描述
下面的阶乘函数很好...
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/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-1
与 n * (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
~> ...