0

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

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

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

但真正的问题是当涉及到乘法时。list1 - '(pp . d) list2 - '(ppppp . q) 结果预期 - (2 * 5 = 10 p's) 所以 '(pppppppppp . z)

我尝试使用 while loop 、 do while 、 add custom function ,但我似乎不知道该怎么做。也许一些指导可以帮助我:)

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

4

1 回答 1

0

我将其添加为答案,因为它似乎解决了您的原始问题,尝试使用方案中的 cons 列表来实现 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)

类似地,可以在 add 函数的基础上构建一个乘法函数,使用:

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

(现场示例)

于 2015-10-05T00:52:04.683 回答