You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)时:

  1. 递归处理(cdr (cdr ls))也就是'(3 4 5),最终得到'(5 3)
  2. 把当前元素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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:40:47