2016-06-22 3 views
0

Я реализовал функцию (объединить Fn l1 l2), которая объединяет два списка попарно с е и возвращает список:Ракетки: Как объединить два списка попарно с й

(check-expect (combine string-append "" '("1" "2" "3") '("4" "5" "6")) '("14" "25" "36")) 
(check-expect (combine + 0 '(1 2 3) '(4 5 6)) '(5 7 9)) 


(define (combine f n l1 l2) 
    (if (empty? l1) '() 
     (cons (foldr f n (first (zip l1 l2))) 
     (combine f n (rest l1) (rest l2))))) 

Он использует (почтовый l1 l2) функция я реализовывал ранее:

(check-expect (zip '(1 2 3 0) '(4 5 6))'((1 4) (2 5) (3 6))) 

(define (zip l1 l2) 
    (local 
    [(define (take lst n) 
     (if (zero? n) 
      '() 
      (cons (first lst) 
        (take (rest lst)(- n 1))))) 
    (define min-lsts 
     (min (length l1) (length l2)))] 
    (foldr (lambda (e1 e2 acc) (cons (list e1 e2) acc)) '() (take l1 min-lsts) (take l2 min-lsts)))) 

(скомбинировать Fn l1 l2) работает, как ожидалось, но есть способ, чтобы изменить его (объединить ф l1 l2), что не ожидает, п, но до сих пор использует foldr?

Заранее благодарен!

ответ

1

Пока у вас всегда есть два аргумента, вы можете заменить рекурсию с foldr и использовать только два аргумента непосредственно:

(define (combine f l1 l2) 
    (foldr (lambda (a1 a2 acc) 
      (cons (f a1 a2) 
       acc)) 
     '() 
     l1 
     l2)) 

застежка-молния Также реализована слишком сложной. Это можно сделать намного проще:

(define (zip l1 l2) 
    (map list l1 l2)) 

 Смежные вопросы

  • Нет связанных вопросов^_^