Recursion 方案列表操作(递归)

Recursion 方案列表操作(递归),recursion,scheme,racket,cons,r5rs,Recursion,Scheme,Racket,Cons,R5rs,这里的基本问题是,当给定一个列表时,返回该列表中除最后一个元素之外的所有元素。例如,给定(abcd)-->return(abc)。我基本上有这个功能,这只是我遇到麻烦的Scheme语法,而Google不是很友好。我不确定我是否正确使用了cons (define all-but-last (lambda (x) (if (null? (cdr x)) ('())) (cons ((car x) (all-but-last(cdr x))) ))) 熟悉r5rs方案

这里的基本问题是,当给定一个列表时,返回该列表中除最后一个元素之外的所有元素。例如,给定(abcd)-->return(abc)。我基本上有这个功能,这只是我遇到麻烦的Scheme语法,而Google不是很友好。我不确定我是否正确使用了cons

(define all-but-last
  (lambda (x)

   (if (null? (cdr x)) 
      ('()))
   (cons ((car x) (all-but-last(cdr x)))
)))

熟悉r5rs方案语法的人会有所帮助。谢谢

如果删除
'()
cons
的参数周围的额外括号,代码将正常工作(对于非空输入列表)。

使用DrRacket和R5RS语言,这可以:

(define all-but-last
  (lambda (x)
   (if (null? x)
     '()
     (if (null? (cdr x)) 
       '()
       (cons (car x) (all-but-last(cdr x)))))))

请参见此问题的答案:


还有,我要把这个贴上“家庭作业”的标签。如果不是,请告诉我,我将删除它。

替代解决方案:

(define (all-but-last xs)
  (reverse 
    (rest
      (reverse xs))))

如果将“()”传递给函数,我认为应该给出错误消息,而不是返回“()”

仍然是一个错误,很遗憾:“mcdr:expected参数类型;gived()”是否有合适的资源?我还没有找到一个能用谷歌搜索的。@decenty:到目前为止你有什么发现?您的代码缺少边界情况,其中x是空列表。有关的文件是好的;对于你正在做的事情,策划和敲诈是一样的。您还可以将R5R本身视为一个参考。在基本情况下,您需要检查您所看到的是否是一个列表。例如,(null?x)必须为false,也必须为(pair?x)。car既不能接受空列表也不能接受非列表,cdr可以接受所有列表,cons必须在第二个参数中有一个列表。@caveman:我相信你的意思是“
cdr
可以接受所有对(包括非空列表)。”谢谢,这对以后会有帮助。这很有效,谢谢。我认为我过早地结束了if语句,这可能导致了问题的出现。您有许多括号放置问题。一是你过早地结束了你的“如果”;但是,在空列表'()和'cons'的参数周围还有一对额外的参数。我预测,从长远来看,花在理解您收到的错误消息上的时间将获得回报。此外,DrRacket中的“初学者”语言将为您提供更好的错误消息,但如果您参加的课程需要R5R,这可能没有帮助。谢天谢地,我很高兴完成Scheme。我从来没有处理过一种语言,其中括号只是分组。对我来说,0和(0)和((0))并不完全是一回事,这是一个奇怪而不直观的问题。这是我后来做的一个测试题。这不是家庭作业,但可能是为某个人写的,所以我真的不在乎是否有这样的标签。