SICP练习1.6的解答
cond和if有着同样的效果,为啥用cond实现的new-if不能用于一些函数?
我自己没想明白,在网上搜集了一下答案,部分解答觉得有道理,整理如下:
解答1:
if和cond都是特定的求值顺序,
即先对判断求值,再根据其结果选择需要求值的部分
既不是应用序也不是正则序
new-if改变了if的特殊性,
如果解释器是应用序,则参数需要先行代换,而导致问题
如果解释器是正则序,则好像无法支持递归,同样也有问题
解答2:
http://blog.csdn.net/xuanyun/article/details/1331872
引用原文:
“我们知道Scheme的解释器在一般情况下采用应用序(Applicative Order)来对表达式求值,简单来说就是解释器总是试图首先对操作符,
操作数等进行求值,然后才会将操作数应用到操作符上进行运算。在我们的newif例子中,解释器试图首先对newif的三个操作数predication ,
then-clause和 else-clause进行求值,完成求值后才会进行cond运算。而在阶乘函数中,else-clause就是(* n (n! (- n 1)))表达式。
在这个表达式的求值过程中又递归调用了n!函数,如此反复,每次都在有机会进行cond运算之前就调用了n!,由于cond从无机会进行运算,
递归的结束条件永远不会被测试,递归调用无限进行,直到Stack Overflow... 那么为什么直接在n!中直接使用if或cond就一切正常呢?
原因是cond或if作为特殊的运算符,含有它们的表达式的求值实际上是不遵循应用序的,实际上,含有cond或if的表达式求值时总是要先对条件
操作数进行求值直到获得true或false,然后再根据得到的结果决定是否对别的操作数进行求值。在采用if的n!版本中,解释器总是先求值(= n 1),
再决定对哪个分支求值。这样由于递归的结束条件在每次调用中都是最先求值,无限递归就不会出现了。而newif对cond包装后,cond的特殊性
就被遮盖了,newif被当作了普通表达式,灾难出现。”
SICP练习1.6的解答的更多相关文章
- Lisp和SICP
大概不少programmer都看过<黑客与画家>,作者用了整整一章的篇幅讨论Lisp的强大.我自然就会手痒痒. 几个月前,几天内攻城略地搞定了Python,用的方法便是 ...
- SICP 习题 (1.14)解题总结
SICP 习题 1.14要求计算出过程count-change的增长阶.count-change是书中1.2.2节讲解的用于计算零钱找换方案的过程. 要解答习题1.14,首先你需要理解count-ch ...
- SICP 习题 (1.9) 解题总结
SICP 习题 1.9 开始针对“迭代计算过程”和“递归计算过程”,有关迭代计算过程和递归计算过程的内容在书中的1.2.1节有详细讨论,要完成习题1.9,必须完全吃透1.2.1节的内容,不然的话,即使 ...
- SICP 习题 (1.13) 解题总结
SICP习题1.13要求证明Fib(n)是最接近φn/√5 的整数,其中φ=(1+√5)/2 .题目还有一个提示,提示解题者利用归纳法和斐波那契数的定义证明Fib(n)=(φn - ψn) / √5 ...
- 【SICP归纳】2 高阶函数和数据抽象
上一篇博文相应的是书中的第一章的一二两节,我们已经大致的有了一种构造的感觉不是么. 书中展示了非常多有趣的句法(syntax). 如今我们要让思想进一步的抽象.写这篇博客的时候并未学完整本书.更不敢说 ...
- SICP 习题 (1.38)解题总结
SICP 习题1.38 紧跟着习题1.37的方向,要求我们用习题1.37中定义的cont-frac过程计算数学家欧拉大师在论文De Fractionibus Continuis 中提到的e-2的连分式 ...
- SICP 课程总结 & 复习
SICP 课程总结 & 复习 小作文 有赖于那个终极的.伟大的.命定的教务系统,我选上了这门课:SICP,Structure and Interpret of Computer Program ...
- 精选30道Java笔试题解答
转自:http://www.cnblogs.com/lanxuezaipiao/p/3371224.html 都 是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我 ...
- 精通Web Analytics 2.0 (8) 第六章:使用定性数据解答”为什么“的谜团
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第六章:使用定性数据解答"为什么"的谜团 当我走进一家超市,我不希望员工会认出我或重新为我布置商店. 然而, ...
随机推荐
- appium 中swipe()方法向左滑动时
应该在UI Automator Viewer中读取到的例如ImageView [180,600][900,1320],如果要左滑,代码中应该是写为driver.swipe(900,1320,180,6 ...
- 启用不安全的HTTP方法解决方案
启用不安全的HTTP方法解决方案 Web AppScan HTTP WebDAV 近期通过APPScan扫描程序,发现了不少安全问题,通过大量查阅和尝试最终还是解决掉了,于是整理了一下方便查阅. 1. ...
- LT3756/LT3756-1/LT3756-2 - 100VIN、100VOUT LED 控制器
LT3756/LT3756-1/LT3756-2 - 100VIN.100VOUT LED 控制器 特点 3000:1 True Color PWMTM调光 宽输入电压范围:6V至 100V 输出电压 ...
- resharper activate
K03CHKJCFT-eyJsaWNlbnNlSWQiOiJLMDNDSEtKQ0ZUIiwibGljZW5zZWVOYW1lIjoibnNzIDEwMDEiLCJhc3NpZ25lZU5hbWUiO ...
- Py修行路 python基础 (十四)递归 及 面向对象初识及编程思想
一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递归策略时,必须有一个明确的递归结束条件 ...
- 4.solr学习速成之bean
以bean的形式提交索引,以bean的形式查询出来 package com.liucheng.solr; import java.io.Serializable; import org.apache. ...
- 03-CSS中的选择器
高级选择器分为: 后代选择器 子代选择器 并集选择器 交集选择器 后代选择器 使用空格表示后代选择器 , 顾名思义 父元素的后代(包括儿子,孙子,重孙子) 中间空格隔开 是后代 .container ...
- Idea的基本介绍
Idea的基本介绍 Idea一般是作为一个Java和Scala的开发工具来使用的,它的使用方法和Eclipse有一些不同,这里记录以下一些基本点. 1.创建项目 创建一个新项目的时候,用户必须选择一个 ...
- 安装oracle xe一些注意点
主要是web管理数据的的端口8080端口的问题, 会和tomcat冲突 安装时把开启8080端口的tomcat启动了 占用8080端口就行了, 然后安装oracle xe就会让你输入 web管理数据的 ...
- 安装sshpass:No package sshpass available
安装sshpass的时候,报了如下错误: No Package sshpass available 更改软件源之后也无效.直到看到StackOverFlow上的一个问题:https://stackov ...