如何在Scheme中对提取奇数位元素后的列表进行反转?
好问题!你已经有了提取奇数位置元素的函数,要在提取后反转结果其实有两种常用的思路,我来给你拆解一下:
方法1:直接组合现有函数(简洁高效)
最直接的方式就是用Scheme内置的reverse函数,把oddrev返回的结果传进去就行。你可以直接在调用时组合,或者封装成一个新函数方便重复使用:
;; 直接调用的方式 (reverse (oddrev '(1 2 3 4 5))) ; 输出 '(5 3 1) ;; 封装成独立函数 (define (oddrev-then-reverse ls) (reverse (oddrev ls)))
这个方法的优势是可读性强、效率高:oddrev线性遍历列表提取元素,reverse也是线性时间操作,整体时间复杂度是O(n),非常适合处理大列表。
方法2:修改递归逻辑,直接构建反转后的列表
如果你不想依赖内置的reverse,也可以调整原函数的递归逻辑,让它在提取元素的同时直接构建反转后的列表。核心思路是把当前提取的元素放到递归结果的末尾(而不是原函数里的开头):
(define (odd-reverse ls) (cond ((null? ls) '()) ; 空列表返回空 ((null? (cdr ls)) (list (car ls))) ; 只剩一个元素,返回单元素列表 (else (append (odd-reverse (cdr (cdr ls))) (list (car ls))))))
举个实际运行的例子,当输入'(1 2 3 4 5)时:
- 递归处理
(cdr (cdr ls))也就是'(3 4 5),最终得到'(5 3) - 把当前元素
1包装成列表'(1),用append加到递归结果后面,最终输出'(5 3 1)
不过要注意:这个方法里用了append,每次append都需要遍历列表,所以当列表很大时,时间复杂度会变成O(n²),效率不如第一种方法。
验证测试
不管用哪种方法,测试一下都能得到预期结果:
(oddrev-then-reverse '(a b c d e f g)) ; 输出 '(g e c a) (odd-reverse '(a b c d e f g)) ; 输出 '(g e c a)
内容的提问来源于stack exchange,提问作者gly
相关产品推荐
相关产品推荐

