编写一个Scheme函数,它将一个简单的数字列表作为参数,并返回列表中的第二个和第二个最小的数字。返回的值应该在列表中(最小的) 请注意,如果 如果需要,您可以定义minmax函数可以在其体内调用的其他辅助函数。
(DEFINE(minmax list)
(
体
) )
3
这些函数我有max和min但有趣的部分是当我输入这个
(maxtwo'(3 4 2 9 3 8))
我得到的错误是正确的
期望一个真实的第二个参数,给出(列表3 8)
错误是maxtwo函数中的第三行
现在我该如何创建一个函数来调用那些2 mintwo和maxtwo函数,并且作为输出是列表中的第二个最小和第二个数字
答案 0 :(得分:0)
不能说我自信地理解你的问题陈述,但你使用的maxtwo
函数并没有找到列表的第二大元素;它发现了最大的。与mintwo
相同。
用于在C:
中查找数组的第二大元素的算法int snd_maximum(int arr [], int size) {
int max = * arr++;
int snd = * arr++;
size -= 2;
int n;
if (snd > max) {
n = max;
max = snd;
snd = n;
}
while (size --) {
n = * arr++;
if (n > max) {
snd = max;
max = n;
}
else if (n > snd) {
snd = n;
}
}
return snd;
}
该集合必须具有≥2个元素。粗略的翻译:
(define (snd-max xs)
(define (trav max snd xs)
(if (null? xs)
snd
(let ((x (car xs)))
(if (> x max)
(trav x max (cdr xs))
(if (> x snd)
(trav max x (cdr xs))
(trav max snd (cdr xs)) )))))
(let ((x (car xs))
(x' (cadr xs)) )
(if (> x x')
(trav x x' (cddr xs))
(trav x' x (cddr xs)) )))
第二大和-least的搜索可以组合成一个集合的遍历,返回两个结果的元组。
通常,要查找集合的n个最大元素,必须从该集合中删除重复元素并进行排序。然后一个序数(自然从1)查找提供。要找到第n个最大元素,该集合必须具有≥n个唯一元素。