【问题标题】:Multiply in Scheme for cons lists在 Scheme 中乘以 cons 列表
【发布时间】:2015-10-04 19:50:40
【问题描述】:

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

但是,我现在想根据 p 的数量将 & 相乘,我有一个自定义函数,可以为我提供 list count 。比如说,对于 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 .z)

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

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

【问题讨论】:

  • 什么是dz?通常两个列表的总和是标准过程append,但它不能做点列表,因为根据你的说法,附加到(a . b)(a . b)(a a . b),但是第一个列表b 呢?你写了你说的代码,但它在哪里?如果您需要帮助,您需要付出一些努力。
  • 你想实现 peano 数字...对吗?
  • 你的逻辑很好,但问题在于你的代码细节,因此只有逻辑没有代码,我们很难猜出你做错了什么......为什么不你重写它(如果你知道你所遵循的逻辑,它不会超过 2 分钟)所以我们可以检查它?

标签: scheme cons


【解决方案1】:

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

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

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)

【讨论】:

  • 非常感谢...我也会尽快发布解决方案...但是,与我觉得相对容易得多的 peano 数字相比,我在之前的评论中发布的问题似乎非常复杂...
  • 该问题与原始问题有关吗?元组是什么意思?
  • 是的,它的工作原理,但有人可以指导我如何理解它吗?因为我对计划比较陌生。也许有可能建立相同的逻辑,但使用基本的东西......好奇:)
  • 抽象的意义在于隐藏“东西”。因此,如果您不理解那里的解决方案,只需尝试自己实现使用的抽象(map 和朋友),与他们一起处理一些数据集等。这会让您对他们正在做的事情有所了解,这样您就可以使用它来理解链接答案中的复杂功能。在不使用这些抽象的情况下编写该函数会导致大量文本,完全无法维护且无法理解。
  • 同意...但是,正如我所说,我只是好奇 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多