2015-05-04 92 views
1

我對於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

獎金信息:由於'GET-nth'沒有連接到一個對象,一個使用單詞「功能」來形容它。 「方法」一詞用於描述附加到對象的功能。 – soegaard

回答

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) 
+0

謝謝。這有助於我理解 – user3400060