我试图递归地比较并输出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)并做同样的事情直到我们经历每个位置。
提前感谢所有帮助。谢谢!
答案 0 :(得分:2)
要致电testFunc
,您必须使用(testFunc arg1 arg2)
。您必须不使用(testFunc(arg1 arg2))
。方案是括号敏感的;你不能添加(或删除)额外的括号。
同样,要收集结果,您需要使用(cons item rest)
,而不仅仅是(item rest)
。
您是否考虑过只使用(map min list1 list2)
?
答案 1 :(得分:0)
你想要的是2个列表中的k-minor数字,其中k是两个列表的大小。有很多方法可以做到这一点。
这是一个想法:
append
两个列表。 sort
他们从低到高。take
前三个。但这不是完全递归的(排序是递归的,但这样的过程不是)。
因此,另一个想法使用尾部递归,使用保存返回结果的列表,我们将其命名为res
,并从名为min-list的列表中获取次要项目。
length
的{{1}}是否为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
中的那个?如果是这样,你可以编写自己的程序来检查哪个是最小值,但如果你不被允许,那么我们将不得不尝试别的东西。 (当我拿到一个时,我会在这里发布下一个想法)。
哦,请说明一下输入列表的形式,它们是从小到大订购的?在你的例子中,它似乎是这样,但如果它不总是那样,那么程序可以改变一点。