Scheme 使用Foldr/Foldl(球拍)交替求和

Scheme 使用Foldr/Foldl(球拍)交替求和,scheme,racket,fold,alternating,Scheme,Racket,Fold,Alternating,再次回答另一个问题。一般来说,对高阶函数是陌生的,所以给我一些余地 目前正在尝试使用foldr/foldl函数而不是递归查找交替和 e、 g.(altsum'(1357))应等于1-3+5-7,总计为-4 我考虑了几种可能的方法来解决这个问题: 将要在一个列表中添加的数字和要在另一个列表中减去的数字折叠在一起 以某种方式使用列表长度来确定是减还是加 可能会生成某种“(1-1-1)掩码,分别相乘,然后将所有内容折叠相加 然而,当列表中的每个项目的每个操作都不相同时,我不知道从何处开始使用foldl

再次回答另一个问题。一般来说,对高阶函数是陌生的,所以给我一些余地

目前正在尝试使用foldr/foldl函数而不是递归查找交替和

e、 g.(altsum'(1357))应等于1-3+5-7,总计为-4

我考虑了几种可能的方法来解决这个问题:

  • 将要在一个列表中添加的数字和要在另一个列表中减去的数字折叠在一起
  • 以某种方式使用列表长度来确定是减还是加
  • 可能会生成某种“(1-1-1)掩码,分别相乘,然后将所有内容折叠相加
  • 然而,当列表中的每个项目的每个操作都不相同时,我不知道从何处开始使用foldl/foldr,因此我在实现我的任何想法时遇到了困难。此外,每当我试图在foldl的匿名类中添加2个以上的变量时,我也不知道后面的变量指的是匿名类中的变量


    非常感谢您的帮助或指点。

    我们可以在这里利用两个高阶过程:
    foldr
    处理列表和
    build list
    生成要执行的交替操作列表。请注意,
    foldr
    可以接受多个输入列表,在这种情况下,我们获取一个数字列表和一个操作列表,并按元素对其进行迭代,累积结果:

    (define (altsum lst)
      (foldr (lambda (ele op acc) (op acc ele))
             0
             lst
             (build-list (length lst)
                         (lambda (i) (if (even? i) + -)))))
    
    它按预期工作:

    (altsum '(1 3 5 7))
    => -4
    

    你的想法还可以。您可以使用
    range
    列出从0到长度-1的数字,并使用每个数字的奇数来确定
    +
    -

    (define (alt-sum lst)
      (foldl (lambda (index e acc)
              (define op (if (even? index) + -)) 
              (op acc e))
            0
            (range (length lst))
            lst))
    
    作为替代方案,您可以使用具有允许不同长度列表和无限列表的
    折叠
    ,以及
    循环列表
    ,您可以在
    +
    -
    之间切换
    lst

    (require srfi/1) ; For R6RS you import (srfi :1)
    
    (define (alt-sum lst)
      (fold (lambda (op n result)
               (op result n))
             0
             (circular-list + -)
             lst))
    
    (alt-sum '(1 3 5 7))
    ; ==> -4
    

    我真不敢相信我竟然忘记了交替求和的偶数/奇数。再次感谢你的帮助。我也很喜欢SRFI-1列表库的循环列表功能,所以感谢您提及它。