首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >方案中两个列表的比较

方案中两个列表的比较
EN

Stack Overflow用户
提问于 2015-10-30 02:33:59
回答 2查看 2.5K关注 0票数 0

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

代码语言:javascript
复制
(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从两个列表中删除第一个元素,并通过调用testFunc else print z(1)重复这个过程,并执行相同的操作,直到我们遍历每个位置。

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

EN

回答 2

Stack Overflow用户

发布于 2015-10-30 03:11:21

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

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

你有没有考虑过只使用(map min list1 list2)

票数 2
EN

Stack Overflow用户

发布于 2015-10-30 21:00:58

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

这里有一个想法:

  1. 第一个append都列出了。
  2. 然后sort从低到高。
  3. 然后take前三个。

但这并不完全是递归的(排序是递归的,但过程本身不是递归的)。

因此,另一个想法是使用尾递归,使用保存返回结果的列表,我们将将其命名为res,以及从名为min的列表中获取次要项的过程。

  1. 检查length of res是否为k。如果是,则返回res
  2. 否则let minorA= (min-list A), minorB=(min-list B)

最后:

代码语言:javascript
复制
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。这是否意味着您不能使用racket/base中的那个?如果是这样的话,您可以编写自己的过程来检查哪个是最小值,但是如果甚至不允许这样做,那么我们将不得不尝试其他的方法。(当我得到一个想法时,我会在这里发布下一个想法)。

哦,请澄清输入列表的形式,它们是从小到大的顺序吗?在您的示例中,情况似乎是这样的,但是如果情况并不总是这样,那么过程可能会发生一些变化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33427777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档