检索Scheme中列表的第n个cdr

检索Scheme中列表的第n个cdr,scheme,racket,Scheme,Racket,我想返回列表的第n个cdr。例如,我说 (第n个cdr3'(abcde))我将得到(cde)作为输出。我不确定我的代码哪里出了问题 我的方法是这样的。我将检查(=num 0)如果是,我将返回列表。如果没有,我将递归调用nth cdr,并从num和cdr列表中减去1 代码是这样的 (define arbitrary-cdr (lambda (num list) (if (= num 0) '()

我想返回列表的第n个cdr。例如,我说
(第n个cdr3'(abcde))
我将得到
(cde)
作为输出。我不确定我的代码哪里出了问题

我的方法是这样的。我将检查
(=num 0)
如果是,我将返回列表。如果没有,我将递归调用
nth cdr
,并从
num
cdr列表中减去1

代码是这样的

(define arbitrary-cdr (lambda (num list)
                        (if (= num 0)
                            '()
                            (arbitrary-cdr (- num 1) (cdr list))
                            )))
但是,当我尝试执行
(任意cdr3'(abcde))


我不知道这意味着什么。当我这么说的时候,意味着我击中了基本情况,只想返回列表。不过我认为我的逻辑是正确的。

您发布的第一个代码是:

(define arbitrary-cdr
  (lambda (num list)
    (if (= num 0)
        (list)
        (arbitrary-cdr (- num 1) (cdr list)))))
您收到的错误是:

scratch.rkt>(任意cdr 3'(a b d c e))
; 应用:不是一个程序;
;  应为可应用于参数的过程
;   给定:'(c e)
问题是您使用了
list
作为
任意cdr
过程的参数;因为Racket是一个lisp-1,所以过程没有自己的名称空间,所以这重新定义了
列表
。使用
(list)
,以及使用
list
重新定义,代码试图调用
((ce))
,但
(ce)
不是一个过程

这是一个很好的例子,说明了为什么不应该在Scheme或Racket中的自己的过程定义中使用
list
或其他内置过程标识符作为参数。在Common Lisp中,您可以避免这种情况,因为Common Lisp是一个Lisp-2,即,有一个单独的函数名称空间

使用更新的代码:

(define arbitrary-cdr
  (lambda (num list)
    (if (= num 0)
        '()
        (arbitrary-cdr (- num 1) (cdr list)))))
我不知道你报告的错误;也许你的代码和你发布的不太一样。但是,代码的逻辑中有一个错误。实际上,将始终返回一个空列表:

scratch.rkt>(任意cdr 3'(a b c d e f))
'()
问题是,当到达基本情况时,您应该返回输入列表,而不是空列表。也就是说,给定
(任意cdr0'(abc))
,您希望结果是
(abc)
。这也意味着您的测试用例是错误的<代码>(任意cdr 0'(a b c d e))
-->(a b c d e),和
(任意cdr 3'(a b c d e))
-->

下面是您的代码重写,使用
xs
而不是
list
以避免重新定义,并在达到基本情况时返回
xs
而不是空列表:

(define arbitrary-cdr
  (lambda (num xs)
    (if (= num 0)
        xs
        (arbitrary-cdr (- num 1) (cdr xs)))))
示例交互:

scratch.rkt>(任意cdr 0'(a b c d e))
"(a b c d e)
scratch.rkt>(任意cdr 1'(a b c d e))
"(b c d e)
scratch.rkt>(任意cdr 3'(a b c d e))
"(丁)

(任意cdr 3'(a b c d e))
中,您编写了一个“卷曲”引号字符(实际引号字符),而不是“直引号”字符。这不是语法错误,因为它是Scheme中的有效标识符。得到答案后,请不要用新问题替换您的问题。
(define arbitrary-cdr
  (lambda (num xs)
    (if (= num 0)
        xs
        (arbitrary-cdr (- num 1) (cdr xs)))))