从方法中调用方法

时间:2015-05-04 21:32:14

标签: racket

我对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

提前致谢,

1 个答案:

答案 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)