列表第一个元素所在的位置为1。
Example:
sash> (element-at '(a b c d e) 3)
sash> c
(1)自己造轮子
因为列表的内存分配并不一定是连续的,所以要访问第K个位置的元素,只能从head出发,直到第K个位置,这跟C中的链表是类似的。
(define element-at
(lambda (ls k)
(if (< k 1)
(raise 'k-less-than-1)
(let loop ([ls ls] [k k])
(cond [(null? ls) (raise 'not-found)] [(= k 1) (car ls)] [else (loop (cdr ls) (- k 1))])))))
这里使用了named-let,在形式上跟普通的let有两点不同:
- 每个let有一个名字,用于递归调用;
- let的绑定的变量的值是随每次调用而不同的,没必要把一些不变的绑定也放在绑定列表里。
(2)使用list-ref
标准函数list-ref
与element-at
功能相似。注意前者索引从0开始。
(define element-at
(lambda (ls k)
(list-ref ls (- k 1))))