• scheme中的fold-left和fold-right


    很困惑scheme中的fold-left和fold-right究竟是如何求值的。先看下面的代码

    > (fold-right / 1 (list 1 2 3))
    3/2
    > (fold-left / 1 (list 1 2 3))
    1/6

    很明显,对于+和*这种有交换律的运算,这2者的计算结果是没有什么区别的,但是对于-和/这样的没有交换律的运算,区别就很大了。对于上面2个调用,可以分别做如下展开

    > (fold-right / 1 (list 1 2 3))
    3/2
    > (/ 1 (/ 2 (/ 3 1)))
    3/2
    > (fold-left / 1 (list 1 2 3))
    1/6
    > (/ (/ (/ 1 3) 2) 1)
    1/6

    其实fold-right和fold-left可以分别做如下重定义,来自sicp

    (define (fold-right op initial sequence)
      (if (null? sequence)
          initial
          (op (car sequence)
              (fold-right op initial (cdr sequence)))))
    
    (define (fold-left op initial sequence)
      (define (iter result rest)
        (if (null? rest)
            result
            (iter (op result (car rest))
                  (cdr rest))))
      (iter initial sequence))
  • 相关阅读:
    第一周例行报告psp
    作业要求 2018091-2 博客作业
    20181011-1第一周例行报告
    20180912-2第一周博客作业
    Elasticsearch
    centos7 安装Hadoop-2.6.0-cdh5.16.1.tar.gz
    centos7安装hadoop2.7.7
    centos7安装jdk8
    专业知识4
    专业知识3
  • 原文地址:https://www.cnblogs.com/valleylord/p/3545881.html
Copyright © 2020-2023  润新知