0

干杯!!!我有一个关于我需要用 pl 语言(lisp 贡献)编写的函数合同的问题,合同假设有一个(类型 A 的列表)(类型 b 的列表)并返回一个列表列表(类型 AB)同时 。这是我到目前为止得到的,但它不起作用:

(: zip2 : (All (A B) (Listof A) (Listof B) -> (Listof (list A B))))
(define (zip2 listA listB)
  (cond [(null? listA) (list (null null))]
        [else (list ((car listA) (car listB)))])
  (zip2 ((rest listA) (rest listB))))

(equal? (list (list 1 'a) (list 2 'b) (list 3 'c)) (zip2 (list 1 2 3) (list 'a 'b 'c)))
4

2 回答 2

1

可能最简单的方法就是使用映射。[由于您使用的是define我假设您使用的是 Scheme]。

(define (zip A B) (map list A B))

如果你不能使用map,那么这里是一个尾递归算法:

(define (zip A B)
  (let zipping ((a A) (b B) (rslt '())
    (if (or (null? a) (null? b))
        (reverse rslt)
        (zipping (cdr a) (cdr b)
                 (cons (list (car a) (car b)) rslt)))))
于 2013-06-06T17:50:52.763 回答
1
(define (zip2 listA listB)
 (cond [(null? listA) null]
       [else (cons (list (car listA) (car listB))
                   (zip2 (rest listA) (rest listB)))]))
于 2013-06-06T13:21:48.663 回答