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
重新实现)。