Определите, образует ли список чисел арифметическую последовательность, используя лямбда-функции высшего порядка
Как я могу определить функцию, которая определяет, является ли список чисел арифметической последовательностью, используя 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
стоит за "рекурсивный результат").