gpt4 book ai didi

recursion - Scheme中基本if表达式的修改。为什么会进入死循环?

转载 作者:太空宇宙 更新时间:2023-11-03 18:41:29 25 4
gpt4 key购买 nike

在 Scheme 中,我将基本的“if”命令修改为:

(define (modified-if predicate then-clause else-clause)
(if predicate
then-clause
else-clause))

然后我使用 if 的修改版本定义了一个简单的阶乘生成程序:

(define (factorial n)
(modified-if (= n 0)
(* n (factorial (- n 1)))))

现在,当我调用上面的函数时,它进入了无限循环。为什么会这样?

最佳答案

方案有热切的评估。这意味着,除非您使用特殊形式(如 if)或宏(如 condcase)委托(delegate)给此类一种特殊形式,所有 子表达式首先被求值。

这意味着你的表情

(modified-if (= n 0)
1
(* n (factorial (- n 1))))

(* n (factorial (- n 1)))modified-if 运行之前首先被评估。 (它可能在 (= n 0) 之前或之后运行,但不管怎样,递归调用仍然会发生。)并且由于这是一个递归调用,这意味着你的程序将无限递归,最终会耗尽堆栈。

这是一个简单的例子:考虑一下:

(if #t
(display "Yay!")
(error "Oh noes!"))

因为 if 是一种特殊形式,它只计算必要的分支,在这种情况下它只会计算 (display "Yay!") 而不会计算 (错误“哦,不!”)。但是,如果您切换到使用 modified-if,则两个表达式都将被计算,并且您的程序将引发错误。

关于recursion - Scheme中基本if表达式的修改。为什么会进入死循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16275157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com