Определите, образует ли список чисел арифметическую последовательность, используя лямбда-функции высшего порядка

Как я могу определить функцию, которая определяет, является ли список чисел арифметической последовательностью, используя lambdaи только одна из функций высшего порядка filter, map, или же foldr (но не build-list)?

Я думал о том, чтобы сформировать список всех последовательных различий, а затем проверить, все ли они равны, но это потребовало бы build-list функция.

Другой подход, о котором я подумал, заключался в использовании foldr, но я не уверен, как я могу вычислить общие различия между каждым последующим сроком.

2 ответа

Если вам разрешено использовать srfi/1 версия map (который допускает неровные входные списки, в отличие от 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))))

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 стоит за "рекурсивный результат").

Другие вопросы по тегам