从列表中创建列表

时间:2015-05-12 08:46:45

标签: scheme racket

我想编写一个函数,n个参数将创建n个列表,每个参数包含每个参数的第n个元素,例如:

(aux '(1 2) '(3 4)) = `((1 3) (2 4))

我写了这样一个函数:

(define (aux . args) 
  (if (null? args) 
      '() 
      (cons (map car args) 
            (aux (map cdr args)))))

但是当我尝试评估(aux '(1 2) '(3 4))时,REPL没有显示任何输出。 我的问题是我应该改变什么,因为我没有看到任何语法错误。

2 个答案:

答案 0 :(得分:2)

您忘了在函数中写apply。别担心,我总是犯这个错误,这就是我立刻发现它的原因。 ; - )

基本上,您需要使用(apply aux (map cdr args))。否则,仅使用一个参数递归aux

哦,你还需要使用(ormap null? args)而不仅仅是(null? args),因为基本情况是所有给定的列表都已用尽,而不是你没有给定的列表。

答案 1 :(得分:2)

克里斯是对的。如果你想使用rest参数然后在递归中使用它,你应该考虑将它包装在一个名为let中,或者做一个本地帮助程序。

(define (zip . args)
  (let aux ((args args))
    (if (ormap null? args) 
        '() 
        (cons (map car args)
              (aux (map cdr args))))))

当有不改变的参数时,我也会这样做。例如。只有一个列表的map实现我没有在每次迭代时传递过程:

(define (map1 proc lst)
  (let aux ((lst lst))
    (if (null? lst)
        '()
        (cons (proc (car lst))
              (aux (cdr lst))))))

当然实际会发生什么取决于实现,所以不要将其中的任何一个视为优化。它主要用于代码清晰度。