zoukankan      html  css  js  c++  java
  • 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被当作了普通表达式,灾难出现。”

  • 相关阅读:
    面试题:求最大子数组的合以及起始终止位
    星级推荐,列举一下2018年购入的书籍
    Idea Live Templates
    oracle 学习随笔一: 字段大小写
    gitignore 文件生效办法
    同台服务器 部署多个tomcat 需要做的修改
    FastJson 序列化与反序列化一些说明
    记一次Log4j2日志无法输出的 心酸史
    关于.net中使用reportview所需注意
    团队作业——总结
  • 原文地址:https://www.cnblogs.com/wenjingu/p/3229621.html
Copyright © 2011-2022 走看看