以下是问题:
编写一个函数(first-n-elements lst n)
,它返回一个仅包含n
的第一个lst
元素的列表。例如,(first-n-elements '(1 2 3 4 5 6) 3)
应返回'(1 2 3)
。您的函数应该处理n
大于列表长度的情况(在这种情况下它将返回整个列表),并且n
为0(应该返回'()
)
我的回答是:
(define (first-n-elements lst n)
(cond((null? lst) '())
((= n 0) lst))
((> n 0) (cons (+ (car lst) 1) (first-n-elements) (cdr lst) (- n 1))))
我知道这是错的,请帮忙
答案 0 :(得分:4)
你有一个自然数字和一个列表,你需要在这两个上进行递归。请参阅recursion on two complex arguments上的本章。简短的回答是,您必须考虑两个参数(笛卡尔积,本质上)的所有案例组合。当然,您可能会发现某些案例可能会崩溃,但如果有疑问,请先分别考虑它们。
答案 1 :(得分:1)
部分问题是,如果n
为0,则应返回'()
。但是当n
为0时,你的函数会做什么?
另外,请考虑这里的递归情况(> n 0
)。您目前正在返回四个参数中的cons
:
(+ (car lst) 1)
(first-n-elements)
(cdr lst)
(- n 1)
但是cons
只有两个参数。你拥有所有的部件,但他们并没有完全正确地组合在一起。你想要cons
一起做什么?
另外:为什么要向(car lst)
添加1?如果lst
中包含数字以外的其他内容,则无法正常工作。