2016-11-19 2 views
-4

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

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

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

+4

Хороший вопрос заданий! – spectre10

ответ

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

0

Если вам разрешено использовать версию 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)))) 
+1

ах, 'drop-right!' Конечно! (не знал, что он существует) .... :) с ним, '(apply = ...' можно заменить на '(null? (filter (not (= (car diffs) ...', чтобы полностью соответствовать с требованиями. (и если 'drop-right' не разрешено, его можно переопределить также с помощью' foldr'). –