获取“应用程序:不是过程”错误

时间:2013-10-03 01:25:38

标签: scheme

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

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

它目前只返回上述错误

1 个答案:

答案 0 :(得分:0)

您的解决方案中存在一些错误:

  • 在第二个条件中,您忘记了cons当前值 - 请记住,我们以递归方式构建列表作为答案,我们必须使用cons来这样做
  • 第二个和第三个条件应使用0而不是1。否则,当n等于零
  • 时,该过程将失败
  • 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)