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 に答える