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被当作了普通表达式,灾难出现。”

posted on 2013-08-01 11:28  顾文锦  阅读(709)  评论(0编辑  收藏  举报