使用Foldr / Foldl(球拍)的交替总和

时间:2018-06-15 19:18:03

标签: scheme racket fold alternating

再次回到另一个球拍问题。一般来说是高阶函数的新手,所以给我一些余地。

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

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

我想过几种可能的方法来解决这个问题:

  1. 获取要添加到一个列表中的数字以及要在另一个列表中减去的数字并将它们折叠在一起。
  2. 以某种方式使用列表长度来确定是否减去或添加。
  3. 也许生成某种'(1 -1 1 -1)面具,分别相乘,然后折叠添加所有内容。
  4. 但是,我不清楚当列表中的每个项目的每个操作都不相同时,从哪里开始使用foldl / foldr,所以我无法实现我的任何想法。另外,每当我尝试在我的foldl的匿名类中添加2个以上的变量时,我都不知道之后哪些变量引用了匿名类中的变量。

    非常感谢任何帮助或指示。

2 个答案:

答案 0 :(得分:1)

我们可以在此处使用两个高阶过程: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

按预期工作:

tap

答案 1 :(得分:1)

你的想法没问题。您可以使用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))

作为替代方案,可以使用fold circular-list+允许使用不同的长度列表以及无限列表,并与-一起使用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 public class HomeViewModel { public Genre Genre { get; set; } public Author Author { get; set; } } 持续时间为Model.Genre

Tuple