zoukankan      html  css  js  c++  java
  • 【SICP练习】67 练习2.38

    

    练习2.38

    这道题比较有意思了,我们先来将fold-leftaccumulate类比,accumulate是递归,而fold-left是迭代。前者通过不断地将(op result (car rest)变换成initial,通过将(cdr rest)变换成sequence,而rest一开始其实就是sequenceresult一开始则是initial

    result——(op result (car rest))

    rest——(cdr rest)

    因此我们将(fold-left / 1 (list 1 2 3))展开如下:

    (iter 1 ‘(1 2 3))

    (iter (/ 1 1) ‘(2 3))

    (iter (/ (/ 1 1) 2) ‘(3))

    (iter (/ (/ (/ 1 1) 2) 3) ‘())

    (/ (/ (/ 1 1) 2) 3)

    (/ (/ 1 2) 3)

    (/ 1/2 3)

    1/6

    既然书上说了accumulate又称为fold-right,也就是accumulate的定义同样适用于fold-right了。而它就更加简单了:(/ 1 (/ 2 (/ 3 1) ) ),也就是3/2

    将其中的值代换一下得到:(list 1 (list 2 (list 3 ‘() ) ) ),也就是(1 (2(3 () ) ) ),这就是第三小题的结果了。

    而第四小题将第二小题的过程代换一下就是如此:(list (list (list ‘() 1) 2) 3),也就是( ( ( ‘()1) 2) 3)

    如果要让fold-leftfold-right对任何序列产生相同的结果,那么就需要传说中的结合律了。不管从左边操作过去,还是从右边操作过来,都是一样的结果。最简单的就是加法了,而且andor一类的函数也可以达到相同的效果。

    版权声明:本文为 NoMasp柯于旺 原创文章,如需转载请联系本人。

  • 相关阅读:
    一段代码让你了解匿名函数的来龙去脉
    橡皮擦背景色橡皮擦魔术橡皮擦
    flv播放器
    测试面试题01
    java中堆和栈的区别
    经典javaThead 生产者 消费者
    判断一个点是否在三个点组成的三角形内 java 代码 面试经典
    软件项目管理面试题
    java中的位运算
    真正的JDBC java代码
  • 原文地址:https://www.cnblogs.com/NoMasp/p/4786152.html
Copyright © 2011-2022 走看看