为什么这个球拍代码没有终止?

jeebface

我正在阅读有关懒惰评估的内容,并且难以理解他们给出的基本示例。

#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,阶乘错误也会执行递归函数。

乌塞尔帕

标准 if

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

只会评估要么 then-expr 或者 else-expr根据test-expr,因为这if可以是一个特殊形式句法扩展基于一种特殊形式,这意味着它不遵循正常的评估规则上。

bad-if另一方面,这是标准程序。在那种情况下,Scheme首先评估两个表达式,因为它们是实际执行bad-if 之前过程的参数bad-if因此,即使对于x = 0,(* x (factorial -1))也将进行(* x (factorial -2))无穷循环计算,依次进行计算,依此类推,依此类推。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么这个主要方法没有被终止?

为什么这个XPlot.Plotly代码没有编译>

为什么这个js代码中的值没有改变?

为什么这个Ruby代码没有返回预期的答案?

为什么这个ruby代码没有引发异常?

为什么这个jquery代码没有执行?

为什么这个简单的代码没有运行 if only var

为什么程序没有终止?

在检查“退出”字符串时,为什么我的代码没有在循环中终止?

为什么我的代码在输入全名时没有执行 nextLine() 函数就终止了?

为什么我的代码在输入全名时没有执行 nextLine() 函数就终止了?

为什么这个任务没有完成?

为什么这个程序没有崩溃?

为什么这个循环没有运行?

为什么这个类没有编译?

为什么这个程序没有输出?

为什么这个 D3 exit() 代码没有按预期工作?

为什么这个缓冲通道没有在我的代码中阻塞?

为什么我的代码没有进入这个适配器类?

这个 jQuery 代码在它没有之前工作,现在为什么?

为什么这个flutter代码应用程序中没有返回列表记录?

为什么这个java代码没有给出“已经定义”的错误?

为什么这个while循环没有在下面的代码中结束?

为什么我用这个简单的代码没有收到段错误?

为什么当我输入这个 powershell 代码时它没有被执行?

为什么这个Beautiful Soup代码没有获取目标数据?

为什么这个MPI_Bcast相关代码没有死锁?

Arduino IDE:“没有命名类型”,为什么我不能写这个代码?

为什么这个 rust 代码在没有文件时挂起,但在文件存在时运行良好?