这是我必须解决的任务:编写一个迭代函数,它接收带有数字的列表并创建一个新列表,该列表仅包含接收列表中的偶数。
我甚至发现了一些有类似问题和解决方案的帖子,但我不能将它们用作帮助,因为在这些解决方案中他们使用的是“car”和“cdr”命令,我们在安排。怎么办呢?我会这样开始:
(define filter-odds
(lambda(x)
(if (odd? x)
...)
答案 0 :(得分:0)
好吧,如果没有car
/ cdr
个访问者,您唯一的另一个选择就是使用SRFI1中的reduce
:
(define filter-odds
(lambda (lst)
(reduce-right
(lambda (e ; list's element
acc) ; accumulated results from the right
(if (odd? e)
.... ; combine e and the results-so-far
.... )) ; ignore e
'()
lst )))
但是,正确减少最有可能不会迭代。通常是左减少。它会以相反的顺序构建结果,但是您可以使用相同的方法在另一个传递中迭代地反转列表,而不进行任何过滤(即使用始终成功的测试过程)。
虽然可以使用first
/ rest
访问者,但您需要做的就是自己写下reduce
的实现,然后将保险丝写入上面的定义:
(define reduce
(lambda (f acc ls)
(if (null? ls)
acc
(reduce f (f acc (first ls)) .....))))
换句话说,只需按照上面的code skeleton进行操作,然后将对f
的调用替换为对odd?
或其他内容的一些检查,以获取filter-odd?-reversed
;然后找出要使用的f
以定义reverse-list
函数。
答案 1 :(得分:0)
可怕的疏忽:这里没有人提到How To Design Programs。这种程序正好在HtDP的路径中间。具体来说,这是第9.3节“#34;使用列表编程”中列表模板的完全直接应用。"也许你的班级已经在使用HtDP了?