【发布时间】:2012-09-24 00:42:16
【问题描述】:
我正在尝试编写一个名为 unzip 的函数,它接受一个列表并计算出两个列表的列表,其中两个列表具有原始列表的交替元素。
到目前为止,这是我所拥有的:
(define (unzip lst)
(if (null? lst)
'()
(...
它应该是这样工作的:
(unzip '(1 a 2 b 3 c)) 应该评估为 ((1 2 3) (a b c))
【问题讨论】:
我正在尝试编写一个名为 unzip 的函数,它接受一个列表并计算出两个列表的列表,其中两个列表具有原始列表的交替元素。
到目前为止,这是我所拥有的:
(define (unzip lst)
(if (null? lst)
'()
(...
它应该是这样工作的:
(unzip '(1 a 2 b 3 c)) 应该评估为 ((1 2 3) (a b c))
【问题讨论】:
抱歉,您所拥有的东西走错了路。 (想想如果给定一个空输入,结果应该是什么。)类似于我对你上一个问题的回答,这是一个框架解决方案:
(define (unzip l)
(if (null? l) ???
(let ([next (unzip ???)])
(list (cons ??? ???) ???))))
适当填写???s。 (是的,我的解决方案经过测试,适用于奇数和偶数输入。)
【讨论】:
next 不是函数。它是在let 中定义的变量。现在,想想它应该在逻辑上做什么。 (我把括号改成了方形,更符合 Racket 的风格。希望这能让事情变得更加明显。)
next 确实是(unzip (cdr l))。现在,您应该考虑如何在给定旧结果的情况下组装新结果。试试这个:想想结果是什么,对于一个空的输入。然后,对于单元素输入。然后是2个元素。等等。您将很快了解每一步需要做什么。
(cons (car l) ???) 部分是正确的。 (cdr l) 部分不是。你能弄清楚为什么不吗? (另外,提示:至少一个子表达式将涉及 next 变量。否则,我一开始就没有定义它的意义。)