0

此代码的目的是删除并返回列表 X 的前 N ​​部分

{define (grab x n) 
   (cond
     [(< (len x) n) x]  
     [(> n 1)((car x) (grab(cdr x) (- n 1)))]
     [(= n 1)(car x)]
 )}

它目前只返回上述错误

4

1 回答 1

0

您的解决方案中有几个错误:

  • 在第二种情况下,您忘记cons了当前值 - 请记住,我们正在递归地构建一个列表作为答案,我们必须cons这样做
  • 第二个和第三个条件应该使用0而不是1。否则程序将在n等于 0时失败
  • 基本情况,当n等于零时,应该返回空列表 - 否则输出列表将无法正确构造

完成上述所有修复后,该过程将起作用:

(define (grab x n)
  (cond
    [(< (len x) n) x]
    [(> n 0) (cons (car x) (grab (cdr x) (- n 1)))]
    [(= n 0) '()]))

作为旁注,您基本上是在实施该take过程,如果您的解释器中可以使用该过程(除非如果大于列表的长度take会引发错误):n

(take '(1 2 3 4 5) 3)
=> '(1 2 3)
于 2013-10-03T02:15:31.960 回答