Рекурсия в C. Программа должна давать самый большой элемент массива - PullRequest
0 голосов
/ 29 сентября 2018

Программа должна выдавать самый большой элемент массива (A) с помощью рекурсивной пустоты TMax. Но это не работает. Я думаю, что есть ошибка из-за указателей Макса, и я не могу ее исправить.помогите мне, пожалуйста?

#include <stdio.h>
#include <stdlib.h>

void TMax(int A[], int N,int *Max)
{
    if(N==0){
       *Max=A[0];
    }
    else
    {
        *Max=A[N];
         if(A[N]>*Max)
        {
            *Max=A[N];
        }
         TMax(A,N-1,*Max);
    }
}

int main()
{
    int A[] = { 1, 2, 999, 4, 20};
    int N = sizeof(A) / sizeof(A[0]);
    int k=A[N];

   TMax(A,N,&k);

    printf("%d",k);
}

Ответы [ 3 ]

0 голосов
/ 29 сентября 2018
  1. Вы передаете int в int *, что неверно и приведет к неопределенному поведению.

    Даже компилятор предупреждает об этом.

    warning: passing argument 3 of 'TMax' makes pointer from integer wi
    thout a cast [-Wint-conversion]
              TMax(A,N-1,*Max);
    
  2. Вы обращаетесь к массиву вне пределов, максимальный индекс равен N-1.

  3. Ваш базовый случай назначает *Max=A[0]; в этом случае ваш mas будет всегда нулевым, поэтому удалите присвоение и просто верните ..

Пример кода:

void TMax(int A[], int N,int *Max)
{
    if(N==0){
       return;
    }
    else
    {
        if(A[N]>*Max)
        {
            *Max=A[N];
        }
         TMax(A,N-1,Max);
    }
}

И из main вы звонитевот так.

TMax(A,N-1,&k);
0 голосов
/ 29 сентября 2018

sizeof (A) / sizeof (A [0]) вернет вам размер массива.В вашем случае он вернет 5, и вы пытаетесь присвоить index 5 значение массива в k , но в случае формы индекса массива start 0 для n-1 , так что k будет содержать мусорное значение. Попробуйте правильно изменить значение N

0 голосов
/ 29 сентября 2018

У вас есть несколько ошибок:

в Tmax:

    if(N==0){
       *Max=A[0];
    }

Вы хотите проверить, является ли массив пустым.Тогда он имеет нет элементов и даже A[0] не существует.Помните, что индексы массива в C начинаются с 0..n-1.Также:

    *Max=A[N-1];

и в main тоже: int k=A[N-1];

в Tmax, когда вы рекурсивно вызываете Tmax, вы должны передать Max, так как это ужеуказатель, а не *Max, который будет значением из Max, поэтому:

    TMax(A,N-1,Max);
...