如何在没有循环的情况下找到C中一组数字的最小值和最大值?

1 c

假设我有10个数字(双打),我必须找到最小数字和最大数字而不使用循环,我该怎么办?

pax*_*blo 7

在伪代码中,如果这是作业:

min = arr[0]
max = arr[0]
for n in 1..size(arr)-1:
    if arr[n] > max:
        max = arr[n]
    if arr[n] < min:
        min = arr[n]
Run Code Online (Sandbox Code Playgroud)

如果,由于某种原因,你不能使用循环(这肯定标志着它作为家庭作业 - 没有人在他们正确的头脑中尝试没有循环),只需展开循环:

min = arr[0]
if arr[1] < min min = arr[1]
if arr[2] < min min = arr[2]
if arr[3] < min min = arr[3]
if arr[4] < min min = arr[4]
if arr[5] < min min = arr[5]
if arr[6] < min min = arr[6]
if arr[7] < min min = arr[7]
if arr[8] < min min = arr[8]
if arr[9] < min min = arr[9]
max = arr[0]
if arr[1] > max max = arr[1]
if arr[2] > max max = arr[2]
if arr[3] > max max = arr[3]
if arr[4] > max max = arr[4]
if arr[5] > max max = arr[5]
if arr[6] > max max = arr[6]
if arr[7] > max max = arr[7]
if arr[8] > max max = arr[8]
if arr[9] > max max = arr[9]
Run Code Online (Sandbox Code Playgroud)

对于十个条目来说这并不算太糟糕,但随着数量的增加它会变得很麻烦.

或者是对我们更奇怪的想法的递归解决方案:-)

def findMax (arr, cur, idx):
    if idx < 0:
        return cur
    if arr[idx] > cur
        return findMax (arr, arr[idx], idx-1)
    return findMax (arr, cur, idx-1)

def findMin (arr, cur, idx):
    if idx < 0:
        return cur
    if arr[idx] < cur
        return findMin (arr, arr[idx], idx-1)
    return findMin (arr, cur, idx-1)

max = findMax (arr, arr[9], 8)
min = findMin (arr, arr[9], 8)
Run Code Online (Sandbox Code Playgroud)

但我不会把这个递归解决方案 - 如果你还没有完成循环,它可能远远超出你的类运行的水平.


并且,由于递归解决方案是一个相当漂亮,无循环的解决方案(并且你有一个几乎零的机会使用它而不是被发现为抄袭者),这里是:

#include <stdio.h>

static int findMin (int *arr, int cur, int idx) {
    if (idx < 0)
        return cur;
    if (arr[idx] < cur)
        return findMin (arr, arr[idx], idx-1);
    return findMin (arr, cur, idx-1);
}

static int findMax (int *arr, int cur, int idx) {
    if (idx < 0)
        return cur;
    if (arr[idx] > cur)
        return findMax (arr, arr[idx], idx-1);
    return findMax (arr, cur, idx-1);
}

int main (void) {
    int nums[] = {27,18,28,18,28,45,93,14,15,92,65,35,89};
    int min, max;
    int x = sizeof(nums) / sizeof(*nums) - 1;

    max = findMax (nums, nums[x], x-1);
    min = findMin (nums, nums[x], x-1);

    printf ("min=%d, max=%d\n", min, max);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这输出:

min=14, max=93
Run Code Online (Sandbox Code Playgroud)

正如预期的那样但不要在大型​​列表中使用它,因为你可能会耗尽堆栈空间.