2014-02-10 5 views
1

Приведенные два списка возвращают список, элементы которого являются списками размера два, так что для i-го списка первым элементом является -й элемент первого исходного списка и вторым элементом является i-й элемент второго исходного списка. Если один список меньше другого, итоговый список имеет наименьший размер; и, если один из списков пуст, верните пустой список. Например:zip-функция в Racket/Scheme

> (zip '(1 2) '(3 4)) 
'((1 3) (2 4)) 

> (zip '(1 2 3) '()) 
'() 
> (zip '() '(4 5 6)) 
'() 
> (zip '(8 9) '(3 2 1 4)) 
'((8 3) (9 2)) 
> (zip '(8 9 1 2) '(3 4)) 
'((8 3) (9 4)) 
+1

Что вы пробовали до сих пор? пожалуйста, напишите код! иначе люди будут думать, что вы хотите получить домашнее задание бесплатно;) –

ответ

2

Потому что вы не отправлял код, который вы написали, я предполагаю, что это домашнее задание. Я дам вам несколько советов, чтобы начать работу, это общая структура решения, заполнить пробелы - будет намного интереснее, если вы достигнете правильного ответа своими силами!

(define (zip lst1 lst2) 
    (cond ((<???> lst1) ; if the first list is empty 
     <???>)  ; then return the empty list 
     ((<???> lst2) ; if the second list is empty 
     <???>)  ; then also return the empty list 
     (else   ; otherwise 
     (cons (list ; cons a list with two elements: 
       <???> ; the first from the first list 
       <???>) ; and the first from the second list 
       (zip <???> <???>))))) ; advance recursion over both lists 

Я тестировал выше реализации с образцами материалов, и результаты, как и ожидалось:

(zip '(1 2) '(3 4)) 
=> '((1 3) (2 4)) 

(zip '(1 2 3) '()) 
=> '() 

(zip '() '(4 5 6)) 
=> '() 

(zip '(8 9) '(3 2 1 4)) 
=> '((8 3) (9 2)) 

(zip '(8 9 1 2) '(3 4)) 
=> '((8 3) (9 4)) 
1

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

(define (zip l1 l2) 
    (if (or (null? l1) (null? l2)) 
     '() 
     (cons (list (car l1) (car l2)) 
      (zip (cdr l1) (cdr l2))))) 

При условии, что вы обрабатываете базовый регистр, где либо список пуст.

> (zip '(1 2 3 4) '(a b)) 
((1 a) (2 b)) 
> (zip '() '(a b)) 
() 
0

Если ваша реализация карта останавливается на короткий список, то zip может быть определена с map, Scheme в список аргументов и применить. Вот подсказка:

(define (zip . lsts) 
    (apply <??> <??> lsts)) 

RSFI-1 «s map достаточно. Таким образом, в Ракетка добавить (require (only-in srfi/1 map))

6

Попробуйте так:

(map cons '(1 2 3) '(a b c)) 

или так:

(map list '(1 2 3) '(a b c)) 

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

->(zip '(1 2 3) '(x y z)) 
'((1 x) (2 y) (3 z)) 
+1

'(карта cons '(1 2 3)' (a b c)); ==> ((1. a) (2. b) (3. c)) ', а не желаемый результат' ((1 a) (2 b) (3 c)) ' – Sylwester

+0

Любая функция может быть использована там, поскольку функция имеет 2 входных параметра. – alinsoar

+0

Из любопытства, почему лямбда в определении 'zip'? Кажется, что '(define (zip l1 l2) (список карт l1 l2))' будет делать то же самое ...? – cat

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