scheme:返回一个只包含丢失的第一个元素的列表

时间:2011-11-02 19:55:52

标签: scheme

以下是问题:

编写一个函数(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))))

我知道这是错的,请帮忙

2 个答案:

答案 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中包含数字以外的其他内容,则无法正常工作。