1

我有一个 Javascript 程序,它可以找到数组的最大值,但现在我想直接翻译成 C。请参见下面的 Javascript 和 C 代码:

Javascript(作品):

var tail = function(arr, pos, max) { //max and pos starts at 0 when called
    if (pos === arr.length - 1) {
        return arr[pos] > arr[max] ? arr[pos] : arr[max];
    }
    max = arr[pos] > arr[max] ? pos : max;
    return tail(arr, pos += 1, max);
};

C(需要直接从Javascript翻译):

int main(int arr[], int pos, int max) {
    if (pos == arr.length - 1) {
        return arr[pos] > arr[max] ? arr[pos] : arr[max];
    } else {
        max = arr[pos] > arr[max] ? pos : max;
        return (int arr[], int pos += 1, int max);
    }
}

我在 C 代码中做错了什么?

4

3 回答 3

2

首先,在数组中查找最大元素的代码不需要使用递归(你可以,但是这无助于使代码更简单,更糟糕的是,它需要你有足够的堆栈内存来放置(数组长度) *(堆栈帧大小)。

没有递归的线性搜索示例:

#include <limits.h>

int max_element(int arr[], int len) {
    int max = INT_MIN;
    for (int i=0; i < len; ++i)
        if (arr[i] > max)
            max = arr(i);
    return max;
}
于 2012-12-04T06:11:25.907 回答
1

您无法知道 C 中数组的长度。

main() 函数在 C 中具有特殊的含义,程序的入口点。

递归语法也是错误的。

于 2012-12-04T05:59:23.490 回答
1

这应该有效:

int tail(int *arr, int pos, int max, int len) {
    if (pos == len - 1) {
        return arr[pos] > arr[max] ? arr[pos] : arr[max];
    }
    max = arr[pos] > arr[max] ? pos : max;
    return tail(arr, pos + 1, max, len);
}

请注意,虽然这或多或少是对 JavaScript 的忠实翻译,但它是非常糟糕的代码。除非编译器识别尾递归,否则这有可能溢出调用堆栈,尤其是对于大型数组。遍历数组会好得多。这是一个为空数组任意返回 0 的解决方案:

int max(int *arr, int len) {
    int max = 0, i;
    if (len > 0) {
        max = arr[0];
        for (i = 1; i < len; i++) {
             if (arr[i] > max) max = arr[i];
        }
    }
    return max;
}
于 2012-12-04T06:01:08.420 回答