P03 (*) 获取列表的第K个元素

列表第一个元素所在的位置为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-refelement-at功能相似。注意前者索引从0开始。

(define element-at
    (lambda (ls k)
      (list-ref ls (- k 1))))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值