找到列表中第二大和最小的数字

时间:2017-03-18 14:21:01

标签: list scheme

编写一个Scheme函数,它将一个简单的数字列表作为参数,并返回列表中的第二个和第二个最小的数字。返回的值应该在列表中(最小的) 请注意,如果 如果需要,您可以定义minmax函数可以在其体内调用的其他辅助函数。

(DEFINE(minmax list)

) )

3

这些函数我有max和min但有趣的部分是当我输入这个

(maxtwo'(3 4 2 9 3 8))

我得到的错误是正确的

期望一个真实的第二个参数,给出(列表3 8)

错误是maxtwo函数中的第三行

现在我该如何创建一个函数来调用那些2 mintwo和maxtwo函数,并且作为输出是列表中的第二个最小和第二个数字

1 个答案:

答案 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个唯一元素。