【问题标题】:StandardML factorial evaluation enters infinite loop in Poly/ML REPLStandardML 阶乘评估在 Poly/ML REPL 中进入无限循环
【发布时间】:2021-09-14 16:32:02
【问题描述】:

下面的阶乘函数很好……

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;

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

【问题讨论】:

  • 我认为这可能是因为函数应用的优先级...我认为..

标签: recursion sml polyml


【解决方案1】:

由于 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
       ~> ...

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 详细来说,函数应用的优先级高于其他运算符。这通常很有用。考虑写一个条件if fact 2 < face 5 then ...。这比if (fact 2) < (fact 5) then ... 好得多。但这确实意味着在您的情况下需要额外的括号,以确保在函数应用程序之前进行减法。
    • 道歉......不知道我是如何忽视你们的 cmets..
    • 它发生了。只是意味着 A. 你想通了,B. 你得到了很好的确认。干得好。
    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    相关资源
    最近更新 更多