2012-05-09 67 views
8

我试图从列表中获取循环语句的给定索引的项目。如何从球拍语言的给定索引的列表中获取项目?

(define decision-tree-learning 
    (lambda (examples attribs default) 
    (cond 
     [(empty? examples) default] 
     [(same-classification? examples) (caar examples)] ; returns the classification 
     [else (lambda() 
       (let ((best (choose-attribute attributes examples)) 
        (tree (make-tree best)) 
        (m (majority-value examples)) 
        (i 0) 
        (countdown (length best)) ; starts at lengths and will decrease by 1 
        (let loop() 
        (let example-sub ; here, totally stuck now 
         ; more stuff 
         (set! countdown (- countdown 1)) 
         ; more stuff 
        )))))]))) 

在这种情况下,best是列表,我需要在countdown指数来获得它的值。你能帮助我吗?

+0

不是循环遍历索引并使用'list-ref',为什么不直接在列表中循环? –

+0

另请注意,如果您发现自己在通过列表进行随机访问,那么它可能不是适合您数据的容器类型。球拍(以及Scheme)提供支持恒定时间随机访问的* vector *类型。 http://docs.racket-lang.org/guide/vectors.html – dyoo

+0

感谢您的评论。我非常喜欢拍拍朗,我非常欣赏这一切。 – lu1s

回答

4

或者这样建立自己:

(define my-list-ref 
    (lambda (lst place) 
     (if (= place 0) 
      (car lst) 
      (my-list-ref (cdr lst) (- place 1))))) 

,但如果你想检查列表完成和Don”不要担心错误哟也可以这样做:

(define my-list-ref 
    (lambda (lst place) 
     (if (null? lst) 
      '() 
      (if (= place 0) 
      (car lst) 
      (my-list-ref (cdr lst) (- place 1)))))) 
+0

为什么要重写已经内建的函数? –

+1

@ leo-the-manic:简单:理解它如何在内部工作,并能够在其他环境中使用这些概念。你不会在生产环境中使用它,但为了学习的目的,这是合理的。 – Zelphir

相关问题