在 Scheme 中乘以 cons 列表

Multiply in Scheme for cons lists

我能够制作一个方案代码来在方案中添加两个缺点列表。 比如说,list1 - '( p . d) list 2 ' ( p p p . d) 我使用 cdr 和汽车概念的自定义添加功能可以按预期执行 (p p p p .d)。

但是,我现在想根据 p 的数量将 & 相乘,我有一个自定义函数可以给出列表计数。比如说,对于 list1 -> 1 list2-> 3

我还可以设法检测两个列表中的任何一个是否为空,所以我输出 'd.

但真正的问题在于乘法。 list1 - '(p p . d) list2 - '(p p p p p . q) 预期结果 - (2 * 5 = 10 p's) 所以 '(p p p p p p p p p p . z)

我尝试过使用 while 循环、执行 while 和添加自定义函数,但我似乎不知道该怎么做。也许一些指导可以帮助我 :)

我想构建自定义函数,因为我不想使用集合!或任何使过程更容易但想了解递归在这种情况下的工作方式的任何东西:)。

我将此添加为答案,因为它似乎解决了您最初的问题,试图在方案中使用缺点列表来实现 Peano 数字。

对于那个从零值开始并函数递增和递减数字。

;; We define our abstraction for zero
(define zero 'D)

;; Increment a number, i.e. get its successor
(define (inc number)
    (cons 'P number))

;; Decrement a number, i.e. get its predecessor
(define (dec number)
    (cdr number))

这允许遍历所有(正)整数。基于这些函数,我们可以构建一个递归性质的 add 函数,利用:

a + 0 = a
a + b = (a + 1) + (b - 1)

类似地,乘法函数可以建立在加法函数之上,使用:

a * 0 = 0
0 * b = 0
a * 1 = a
a * b = a + (a * (b - 1))

这会导致以下代码,但效率非常低:

;; Adding two numbers is done by "shifting" from one to the other, one by one.
;; a + b = (a + 1) + (b - 1)
(define (add lhs rhs)
    (if (eq? rhs zero)
        lhs
        (add (inc lhs) (dec rhs))))

;; Multiplying the dumb way:
;; a * b = a + (a * (b - 1))
(define (mul lhs rhs)
    (if (or (eq? rhs zero) (eq? lhs zero))
        zero
        (if (eq? rhs (inc zero))
            lhs
            (add lhs (mul lhs (dec rhs))))))

(Live example)