我能够制作一个方案代码,在方案中添加两个缺点列表。 比如,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循环,同时添加自定义函数,但我似乎无法弄清楚如何做到这一点。也许一些指导可以帮助我:))
我想建立自定义功能,因为我不想使用套装!或任何使过程更容易但希望在这种情况下理解递归的方式:)。
答案 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))))))