Functional programming 使用高阶函数lambda确定数字列表是否形成算术序列

Functional programming 使用高阶函数lambda确定数字列表是否形成算术序列,functional-programming,scheme,racket,sequence,Functional Programming,Scheme,Racket,Sequence,如何使用lambda,并且仅使用高阶函数filter、map或foldr(但不是构建列表)来定义一个函数来确定数字列表是否为算术序列 我正在考虑形成一个所有连续差异的列表,然后检查它们是否都相等,但这将涉及构建列表函数 我想到的另一种方法是使用foldr,但我不确定如何计算每个连续项之间的共同差异。可以使用多个参数列表调用。例如,您可以使用输入列表调用它,以及它的cdr。然后在组合函数中,你会发现差异,并将其与 (- (cadr xs) (car xs)) 你会提前计算的 不幸的是,两个列表必

如何使用
lambda
,并且仅使用高阶函数
filter
map
foldr
(但不是
构建列表
)来定义一个函数来确定数字列表是否为算术序列

我正在考虑形成一个所有连续差异的列表,然后检查它们是否都相等,但这将涉及
构建列表
函数

我想到的另一种方法是使用
foldr
,但我不确定如何计算每个连续项之间的共同差异。

可以使用多个参数列表调用。例如,您可以使用输入列表调用它,以及它的
cdr
。然后在组合函数中,你会发现差异,并将其与

(- (cadr xs) (car xs))
你会提前计算的

不幸的是,两个列表必须具有相同的长度,因此您必须使用例如

;; (append (cdr xs) (list #f))
(foldr cons (list #f) (cdr xs))
并相应地修改组合函数:

    (lambda (a b r) 
        (and (or .... 
                 (= (- b a) the-diff))
             r))

r
代表“递归结果”)

如果允许您使用
map
srfi/1
版本(与
racket/base
版本不同,它允许不均匀的输入列表),那么它非常简单:

(require srfi/1)
(define (arithmetic-sequence? lst)
  (apply = (map - lst (cdr lst))))
如果您只能使用
racket/list
功能,那么您必须进行列表修剪:

(define (arithmetic-sequence? lst)
  (apply = (map - (drop-right lst 1) (cdr lst))))

很好的作业问题!啊,
向右掉当然!(不知道它的存在)…:)有了它,
(apply=…
可以替换为
(null)(过滤器(不是(=(汽车差异)…
)以完全符合要求。(如果
不允许右放
,也可以用
foldr
重新实现)。