列表求和的方案迭代

时间:2018-11-18 23:09:53

标签: list sum scheme

我想问问是否有人想通过给出两个列表的和的迭代方案代码来帮助我。我已经有了代码的递归版本。

(define (sum-lists l1 l2)(cond ((and (null? l1) (null? l2)) '())
    ((null? l1) l2)
    ((null? l2) l1)
    (else (cons (+ (car l1) (car l2)) (sum-lists (cdr l1) (cdr l2))))))

1 个答案:

答案 0 :(得分:0)

一般的“迭代过程”配方:

  1. 编写一个带有累加器参数的辅助函数。
    在累加器中创建每个中间结果。
  2. 终止递归时,请返回累加器。
  3. 将其传递给合适的初始累加器。

通常在转换列表时将结果反向累积,然后在完成后反转结果。

一个简单的示例,将每个列表元素加1:

(define (add-1 ls)
  (if (null? ls)
      '()
      (cons (+ 1 (car ls)) (add-1 (cdr ls)))))

要进行迭代,请创建一个辅助函数,在该函数中您cons而不是递归结果到累加器:

(define (add-one ls acc)
  (if (null? ls)
      (reverse acc)
      (add-one (cdr ls) (cons (+ 1 (car ls)) acc))))

(请注意,除了引入acc之外,递归包含与以前相同的部分,但顺序不同。)

然后用一个空的累加器开始它:

(define (add-1 ls)
  (add-one ls '()))

您的案例涉及的基础案例略多,因为您需要适应不同长度的输入。
完成它作为练习。

(另一项练习:弄清为什么不需要您的第一个条件(and (null? l1) (null? l2))。)