foldr - добавление заархивированных элементов двух списков

Мне трудно понять функциональность foldr. Я делаю домашнюю работу, и мы должны построить функцию (не нужна папка), которая сжимает элементы двух списков (например, '(1 2 3) (4 5 6) -> (1 4) (2 5) (3 6).

До сих пор это работало довольно хорошо:

(define (zip list1 list2)
  (cond
    [(or (empty? list1) (empty? list2)) '()]
      [else (cons (list (car list1) (car list2)) (zip (cdr list1) (cdr list2)))]))

Но теперь мне нужно создать функцию, которая использует функцию zip, которую я сделал ранее, и объединяет два списка с функцией f и возвращает их в виде списка. (например, (zipfunction + '( 1 2) '(3 4) -> (4 6)

У меня есть основная идея foldr, он будет рекурсивно применять функцию, которую я предоставляю к списку справа налево, но я не могу понять, как это сделать с несколькими списками и несколькими функциями, и нужна ли мне переменная-аккумулятор или нет.

Может ли кто-нибудь помочь мне с этим?

Заранее спасибо!


person halaldin    schedule 29.06.2017    source источник
comment
(define (zipadd f list1 list2) (map (lambda ..... ....f..... ) (zip list1 list2))), чтобы фактически использовать вашу функцию zip.   -  person Will Ness    schedule 30.06.2017


Ответы (1)


Более естественным ответом было бы использование map:

(map + '(1 2) '(3 4))

Конечно, map можно выразить с помощью foldr:

(foldr (lambda (x y acc)
         (cons (+ x y) acc))
       '()
       '(1 2)
       '(3 4))

Что вы должны помнить при использовании foldr, так это то, что он использует один или несколько списков в качестве входных данных, и каждый из его элементов передается в качестве параметра процедуре, и в этой процедуре накопленный результат также передается в качестве параметра с указанным начальным значением. (пустой список в данном случае); Вам решать, как комбинировать/аккумулировать параметры в процедуре, чтобы получить результат.

person Óscar López    schedule 29.06.2017
comment
спасибо, это дает мне более четкое представление о том, как работает fold! - person halaldin; 29.06.2017