递归并返回Scheme中的列表

时间:2012-04-08 08:34:01

标签: list recursion scheme

我无法绕过一种方法来使用递归来创建列表然后返回基本情况的列表。具体来说,我将两个32位数字(x1和x2)输入ALU并逐位(通过ALU1)进行评估,然后创建结果数字的列表。这个递归算法的基本情况是(null?x1),但此时,如何访问结果列表?我知道方案中的列表是不可变的,所以我不能只创建一个空列表并将结果列表附加到它。有帮助吗?这是我第一次参加函数式编程,所以提前感谢。

(define ALU-helper 
   (lambda (selection sub x1 x2 carry-in n)
      (if (null? x1)
          (________?)
          (cons
              (ALU1 selection sub (car x1) (car x2) carry-in n) 
              (ALU-helper selection sub (cdr x1) (cdr x2) carry-in (- n 1))))))

4 个答案:

答案 0 :(得分:5)

假设x1x2都具有完全相同的长度,这应该有效:

(define ALU-helper 
  (lambda (selection sub x1 x2 carry-in n)
    (if (null? x1)
        '()
        (cons
         (ALU1 selection sub (car x1) (car x2) carry-in n) 
         (ALU-helper selection sub (cdr x1) (cdr x2) carry-in (- n 1))))))

当您在输入列表上执行递归并构建新的输出列表时,基本情况为if (null? lst),然后返回空列表'()。那是因为当您cons个新元素时,每个步骤都会生成结果列表;当你到达输入列表的最后一个元素时,你已经构建了输出列表,剩下要做的就是返回列表末尾标记'()

要更清楚地看到它,请尝试使用更简单的示例。此过程只是复制收到的列表作为输入:

(define (copy lst)
  (if (null? lst)
      '()
      (cons (car lst)
            (copy (cdr lst)))))

(copy '(1 2 3 4 5))
> (1 2 3 4 5)

请注意,基本情况是if (null? lst),递归步骤cons是列表(car lst)的当前元素,其结果是在(cdr lst), the rest of the list. In your case, you perform ALU1`上重复出现,当你同时遍历两个列表时,对两个列表的当前元素进行操作。

答案 1 :(得分:0)

可能你只想要一个空的列表,写成null。所以:

(if (null? x1)
    null
    (cons ...))

答案 2 :(得分:0)

这是一种创建新列表的方法:基本上相反的顺序。

(定义envers   (lambda(lat)     (条件       ((null?lat)'())       (else(envers(cdr lat))(car lat)))       )     )   )

答案 3 :(得分:-1)

递归 - 这是一个比喻。

想象一下,你正在搬家。你有很多东西需要转移,你需要确保它到达新家。

让一群朋友来装满卡车。他们会有其他可以提供帮助的朋友。软管的人会有其他朋友等等。直到它归结为一个人将你的东西搬进卡车。

现在每个人都有一些纸张可以告诉你之前卡车里面的东西。现在你有一个列表,通过cillalecting那些纸张。