Нахождение максимума массива рекурсивно - PullRequest
0 голосов
/ 28 июня 2018

Я учусь рекурсии. В качестве упражнения я пытаюсь найти максимум массива рекурсивно.

int recursive (int *arr, int n, int largest) {
  if(n==0)
    return largest;
  else {
    if (*(arr+n)>largest) {
      largest = *(arr+n);
      recursive(arr, n-1, largest);
    }
  }
}

int main() {
  int length = n-1;
  int largest = v[0];
  int z = recursive(arr, length, largest);

  printf("\n%d", z);
}

Я последовал вашим предложениям, используя указатели вместо массивов, и, вероятно, программа выглядит намного лучше. Но все же он не делает, он не показывает максимум правильно. Я думаю, что логика верна.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Прежде всего обратите внимание на предупреждения компилятора, ваша рекурсивная функция не возвращает значение при вводе части else.

Теперь, во-вторых, пожалуйста, не используйте такие вещи, как * (arr + n), которые трудно читать, вместо этого используйте arr [n], в то время как просто предпочтение при использовании массивов в качестве аргументов функции использует int arr [] для вызовите функцию вместо int * arr (в первой версии ясно, что вы должны передать массив).

Третье - назвать вещи вместо int recursive описать, что делает функция, например int maxElemRecursive

Таким образом, ваша рекурсивная функция должна выглядеть примерно так:

int maxElemRecursive(int arr[],int n,int largest)
{
    if(n==0) return largest;
    if(arr[n] > largest) // No need for else because return largest; would've returned value;
    {
        largest = arr[n]; 
    }
    return maxElemRecursive(arr,n-1,largest); // You have to return the value of the function.
                                             // You still pass the array with just arr.
}
0 голосов
/ 28 июня 2018

В C обычно вы не можете объявить массив, размер которого неизвестен во время компиляции, поэтому int v[n] является опасным кодом.
В зависимости от вашего компилятора и настроек компилятора это может быть ошибкой компиляции или ошибкой.

Для таких задач вам нужно узнать об указателях и динамическом выделении памяти .

Примечание: после C99 есть такие вещи, как Массивы переменной длины , но правила немного продвинуты.

Также, чтобы передать массив функции , вы дадите массиву указатель в качестве аргумента:

int z = recursion(v, n, v[0]);

вместо:

int z = recursion(v[n], n, v[0]);
...