比较方案中的两个列表

时间:2015-10-30 02:33:59

标签: scheme racket

我试图递归地比较并输出2个相同大小的列表中的最小数字。示例(testFunc '(3 5 9) '(1 2 11))将返回'(1 2 9)。我尝试过以下方法:

(define (testFunc X Z)
  (if (< (car X) (car Z)) ((car X) (testFunc((cdr X) (cdr Z))))
    ((car Z) (testFunc((cdr X) (cdr Z))))))

我的思考过程和我想要实现的目标:

比较X和Z的第一个元素。如果x(1)小于z(1),则打印x(1)并使用cdr从两个列表中删除第一个元素,并通过调用{{1}重复该过程}打印z(1)并做同样的事情直到我们经历每个位置。

提前感谢所有帮助。谢谢!

2 个答案:

答案 0 :(得分:2)

要致电testFunc,您必须使用(testFunc arg1 arg2)。您必须使用(testFunc(arg1 arg2))。方案是括号敏感的;你不能添加(或删除)额外的括号。

同样,要收集结果,您需要使用(cons item rest),而不仅仅是(item rest)

您是否考虑过只使用(map min list1 list2)

答案 1 :(得分:0)

你想要的是2个列表中的k-minor数字,其中k是两个列表的大小。有很多方法可以做到这一点。

这是一个想法:

  1. 首先append两个列表。
  2. 然后sort他们从低到高。
  3. 然后take前三个。
  4. 但这不是完全递归的(排序是递归的,但这样的过程不是)。

    因此,另一个想法使用尾部递归,使用保存返回结果的列表,我们将其命名为res,并从名为min-list的列表中获取次要项目。

    1. 检查length的{​​{1}}是否为res。如果是,请返回k
    2. 其他res
    3. 最后:

      let minorA= (min-list A), minorB=(min-list B)

      这个想法实际上是递归的。

      我已经编写了代码,但我希望您自己尝试编写代码,所以请告诉我们任何疑问。

      快乐的编码!

      修改: 我已阅读评论,似乎您无法使用if minorA < minor B recursive call with A=(remove minorA A) B=B, res=(cons minorA res), k=k else recursive vall with A=A B=(remove minorB B), res=(cons minorB res), k=k 。这是否意味着你不能使用min中的那个?如果是这样,你可以编写自己的程序来检查哪个是最小值,但如果你不被允许,那么我们将不得不尝试别的东西。 (当我拿到一个时,我会在这里发布下一个想法)。

      哦,请说明一下输入列表的形式,它们是从小到大订购的?在你的例子中,它似乎是这样,但如果它不总是那样,那么程序可以改变一点。