我对Racket很新。我正在尝试编写一个程序来返回列表中的索引元素,返回整个列表。我有两个单独的方法:一个递归方法给出列表的索引元素,如果存在,则给出整个列表。但是,从另一个方法中调用一个方法会给我错误。如果没有索引元素存在,有人可以指导我如何更改此程序以给我整个列表吗?例如,这个调用应该给我整个列表
(get-nth 2'(a b)); ==> a b
#lang racket
(define get-nth
(lambda (index lst)
(if (= index 0) ; when index is zero
(car lst) ; return the first element
(get-nth (- index 1) ; else recurse with the decrement of index
(cdr lst))))) ; and all but the first element (the rest) of lst
;; test
提前致谢,
答案 0 :(得分:1)
为此,您必须将原始列表存储在某处。为了避免不必要的辅助函数,我们可以使用一个名为let
来实现迭代,并在我们必须返回时保留原始lst
。当然,我们必须测试我们用完元素的情况,因为给定的索引在列表之外。这就是我的意思:
(define get-nth
(lambda (index lst)
(let loop ((index index) (my-list lst))
(cond ((null? my-list) lst)
((= index 0) (car my-list))
(else (loop (- index 1) (cdr my-list)))))))
例如:
(get-nth 0 '(a b))
=> 'a
(get-nth 2 '(a b))
=> '(a b)