在方案中乘以利弊清单

时间:2015-10-04 19:50:41

标签: scheme cons

我能够制作一个方案代码,在方案中添加两个缺点列表。 比如,list1 - '(p.d)列表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.q) 结果预期 - (2 * 5 = 10 p' s)所以'(p p p p p p p p p.z)

我尝试使用while循环,同时添加自定义函数,但我似乎无法弄清楚如何做到这一点。也许一些指导可以帮助我:))

我想建立自定义功能,因为我不想使用套装!或任何使过程更容易但希望在这种情况下理解递归的方式:)。

1 个答案:

答案 0 :(得分:0)

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

这允许遍历所有(正)整数。通过这些函数,我们可以构建一个递归性的添加函数,利用:

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

(Live example)