Сравните все элементы списка списков, не используя andmap - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть эти два списка:

(define casos ’((a 3 15 r +)(l 41 9 -)))
(define extension ’((b 4 5 r -)(c 4 90 d -)))

Я хочу получить количество списков этих двух списков, которые имеют свой последний элемент (+ или -).

Для этого я использовал andmap:

(define iguales 0)

(andmap
    (lambda (x y)
        (cond 
          ((eq? (last x) (last y)) 
             (set! iguales (add1 iguales)))) iguales)
    casos extension) 

Если запустить этот код с предыдущими списками, iguales будет равно 1.

Я не думаю,andmap это правильный способ сделать это.

Есть ли лучший способ сделать это без использования andmap?

1 Ответ

0 голосов
/ 27 ноября 2018

Если вам нужно подсчитать , сколько элементов соответствует условию, тогда используйте count, это довольно просто, и вы можете передать более одного списка в качестве параметра (какваш случай):

(define casos '((a 3 15 r +)(l 41 9 -)))
(define extension '((b 4 5 r -)(c 4 90 d -)))

(count (lambda (caso ext) (eq? (last caso) (last ext)))
       casos
       extension)

=> 1

В данном случае, в частности, andmap не является подходящим инструментом.В целом: избегайте использования set!, большую часть времени вы можете делать то, что вы хотите, в стиле функционального программирования.Пожалуйста, найдите время, чтобы изучить список процедур , доступных в стандартной библиотеке.

...