gpt4 book ai didi

scheme - 为什么这个 Racket 代码没有终止?

转载 作者:行者123 更新时间:2023-12-01 08:57:23 25 4
gpt4 key购买 nike

我正在阅读有关惰性评估的内容,但无法理解他们给出的基本示例。

#lang racket
(define (bad-if x y z)
(if x y z))
(define (factorial-wrong x)
(bad-if (= x 0)
1
(* x (factorial-wrong (- x 1)))))

(factorial-wrong 4)

我有点困惑为什么这个程序永远不会终止。我知道以下代码可以正常工作:

(define (factorial x)
(if (= x 0)
1
(* x (factorial (- x 1)))))

(factorial 4)

所以我假设它与范围有关。我尝试一步一步调试,即使 x 映射为 0,factorial-wrong 也会执行递归函数。

最佳答案

标准if

(if test-expr then-expr else-expr)

将仅评估 either then-expr else-expr,具体取决于 test- expr,因为这个if要么是一个特殊形式,要么是一个基于特殊形式的句法扩展,也就是说它没有' t 遵循正常的评估规则。

另一方面,

bad-if 是一个标准过程。在这种情况下,Scheme 首先评估 两个 表达式,因为它们是过程 bad-if before 实际执行 bad-if。因此,即使对于 x = 0,(* x (factorial -1)) 也会被评估,这将反过来评估 (* x (factorial -2)) 和以此类推,无限循环。

关于scheme - 为什么这个 Racket 代码没有终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26496364/

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