4

aサイズの整数配列が与えられた場合n、プロトタイプを使用して末尾再帰関数を記述します

int f(int a[], int n);

配列の最小要素を見つけます。


これは私が思いついた最高のものです:

int f(int a[], int n)
{
   static int *min;

   if (min == 0)
      min = new int(a[n - 1]);
   else if (*min > a[n - 1])
      *min = a[n - 1];

   if (n == 1)
      return *min;
   else
      return f(a, n - 1);
}

それは良くなることができますか?静的変数の使用は好きではありません。

4

2 に答える 2

17
int f(int a[], int n)
{
    if (n == 1)
        return a[0];
    n--;
    return f(a + (a[0] > a[n]), n);
}
于 2012-11-28T01:53:20.023 に答える
2

kmkaplanのソリューションは素晴らしいです、そして私は彼に賛成しました。これは私のそれほど素晴らしい解決策ではなかっただろう:

int f(int a[], int n)
{
    if(n == 1)
        return a[0];

    n--;

    if(a[0] > a[n])
        a[0] = a[n];

    return f(a, n);
}

配列の最小要素は、常にa[0]に格納されます。もともと非変更バージョンを含めていましたが、その後、末尾再帰ではないことに気づきました。

于 2012-11-28T02:22:50.650 に答える