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

时间:2016-11-19 19:31:26

标签: functional-programming scheme racket sequence

如何使用lambda定义一个确定数字列表是否为算术序列的函数,并且只使用高阶函数filtermap,或foldr(但 build-list)?

我正在考虑形成所有连续差异的列表,然后检查它们是否完全相同,但这将涉及build-list函数。

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

2 个答案:

答案 0 :(得分:0)

可以使用多个参数列表调用

foldr。例如,您可以使用输入列表及其cdr来调用它。然后在组合功能中,您可以找到差异并将其与

进行比较
(- (cadr xs) (car xs))

您提前计算的。

不幸的是,两个列表的长度必须相同,因此您必须使用例如(cdr xs)而不是{。}}。

;; (append (cdr xs) (list #f))
(foldr cons (list #f) (cdr xs))

并相应地修改组合功能:

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

r代表"递归结果" )。

答案 1 :(得分:0)

如果您被允许使用//includes #include <QFileDialog> #include <QFile> #include <QTextStream> #include <QMessageBox> // then in the Button,you can use this QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "/home", tr("code file (*.txt)"));// string has the file link // if you using Windows OS replace "/home" with "c://" QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) QMessageBox::information(0,"info",file.errorString()); QTextStream in(&file); QString ex=in.readAll(); srfi/1版本(允许不均匀的输入列表,与map版本不同),那么这很容易:

racket/base

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

racket/list