繁体   English   中英

递归并返回 Scheme 中的列表

[英]Recursion and Returning a list in Scheme

我无法解决使用递归创建列表然后为基本案例返回该列表的方法。 具体来说,我将两个 32 位数字(x1 和 x2)输入 ALU 并逐位计算(通过 ALU1),然后创建结果数字列表。 我对这个递归算法的基本情况是 (null? x1) 但在这一点上,我如何访问结果列表? 我知道方案中的列表是不可变的,所以我不能只创建一个空列表和 append 结果列表。 有什么帮助吗? 这是我在函数式编程方面的第一个 go,在此先感谢您。

(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))))))

假设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))))))

当您对输入列表执行递归并因此构建一个新的 output 列表时,基本情况是if (null? lst) then return the empty list '() 那是因为当你cons新元素时,结果列表是在每一步构建的; 当您到达输入列表的最后一个元素时,您已经构建了 output 列表,唯一剩下要做的就是返回列表结束标记'()

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

(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)并且递归步骤包含列表的当前元素(car lst)以及在 (cdr lst) 上重复出现的结果,即列表的cons (cdr lst), the rest of the list. In your case, you perform (cdr lst), the rest of the list. In your case, you perform ALU1`,这是对两个列表的当前元素的操作,因为您同时遍历两个列表。

可能您只想要空列表,写null 所以:

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

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

(定义 envers (lambda (lat) (cond ((null? lat) '()) (else (list (envers (cdr lat)) (car lat) )) ) ) )

递归 - 这是一个比喻。

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

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

现在每个人都有一张纸,告诉你卡车里有什么东西。 现在你通过收集这些纸片得到了一个列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM