我试图递归地比较和输出两个相同大小的列表中最小的数字。示例(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从两个列表中删除第一个元素,并通过调用testFunc else print z(1)重复这个过程,并执行相同的操作,直到我们遍历每个位置。
提前感谢所有的帮助。谢谢!
发布于 2015-10-30 03:11:21
要调用testFunc,必须使用(testFunc arg1 arg2)。您必须而不是使用(testFunc(arg1 arg2))。方案对括号敏感;您不能添加(或删除)额外的括号。
同样,要组合结果,您需要使用(cons item rest),而不仅仅是(item rest)。
你有没有考虑过只使用(map min list1 list2)
发布于 2015-10-30 21:00:58
你想要的是2个列表中的k个小数,其中k是两个列表的大小。有很多方法可以做到这一点。
这里有一个想法:
append都列出了。sort从低到高。take前三个。但这并不完全是递归的(排序是递归的,但过程本身不是递归的)。
因此,另一个想法是使用尾递归,使用保存返回结果的列表,我们将将其命名为res,以及从名为min的列表中获取次要项的过程。
length of res是否为k。如果是,则返回res。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。这是否意味着您不能使用racket/base中的那个?如果是这样的话,您可以编写自己的过程来检查哪个是最小值,但是如果甚至不允许这样做,那么我们将不得不尝试其他的方法。(当我得到一个想法时,我会在这里发布下一个想法)。
哦,请澄清输入列表的形式,它们是从小到大的顺序吗?在您的示例中,情况似乎是这样的,但是如果情况并不总是这样,那么过程可能会发生一些变化。
https://stackoverflow.com/questions/33427777
复制相似问题