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

Scheme列表交集函数优化:如何避免重复递归调用?

合并列表交集函数中的重复递归调用

你之前的写法错误在于,let里绑定的appel是一个字面量列表'(intersection (cdr l1) l2),而不是递归调用的实际结果。直接使用这个字面量或者eval都无法正确工作——eval会在全局环境中求值,无法获取当前函数的参数上下文,而且完全没必要用它。

正确的做法是在let中直接对递归调用求值并绑定变量,代码如下:

(define (intersection l1 l2)
  (if (null? l1) '()
      (let ((appel (intersection (cdr l1) l2)))
        (if (member (car l1) l2)
            (cons (car l1) appel)
            appel))))

如果想让代码可读性更好,可以给变量换个更语义化的名字,同时用cond简化嵌套的if:

(define (intersection l1 l2)
  (cond ((null? l1) '())
        (else
         (let ((rest-intersection (intersection (cdr l1) l2)))
           (if (member (car l1) l2)
               (cons (car l1) rest-intersection)
               rest-intersection)))))

这样变量只会被求值一次,既消除了重复代码,又保证递归逻辑正常运行。

内容的提问来源于stack exchange,提问作者david

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:42:05