Как передать параметры по ссылке в рекурсивных алгоритмах в c? - PullRequest
0 голосов
/ 07 мая 2018

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

tam: размер массива

сначала я понял это по значению, и это сработало для меня, но мне нужно передать его по ссылке на результат, я действительно не знаю, в чем может быть ошибка, если вы можете мне помочь, пожалуйста, так как при компиляции я сделал ничего не вернуть

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


void search(int a[], int tam, int max,int *result);

int main()
{
    int max,tam=5, result; 
    int array[5]={3,1,5,8,6};

    max=array[0];

    search(array, tam, max, &result);

    printf("the biggest number is: %d",result);
    return 0;

}


void search(int a[], int tam, int max, int *result )
{   
    if(tam==1)
        *result=max;


    if(max<a[tam-1])
        max=a[tam-1];       
        search(a,tam-1,max,result);         

}

Blockquote

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Поскольку код ОП пытается быть хвостовой рекурсивной, а @ ответ Джилла Бейтса является головной рекурсивной, я показываю хвостовое рекурсивное решение.

int find_max_helper(const int *a, int n, int max)
{
    if (n==0) return max;
    else return find_max_helper(a+1, n-1, MAX(max, a[0]));
}

//returns the maximum value in the array of size n elements
//or 0 if the array is empty
int find_max(const int *a, int n)
{
    return n > 0 ? find_max_helper(a+1, n-1, a[0]) : 0;
}
0 голосов
/ 07 мая 2018

При компиляции с помощью 'clang -Wall' вы получаете следующее предупреждение:

предупреждение: все пути через эту функцию будут вызываться [-Winfinite-recursion]

Действительно, у вас нет действующего базового случая и индуктивного шага в вашей функции.

Я бы предложил преобразовать в следующее:

#define MAX(x, y) ((x) > (y)) ? x : y

int search(int a[], int tam )
{   
    // base case if last element
    if (tam == 1) return a[0];  

    // inductive case (max of this and following elements)
    return MAX(a[0], search(a + 1, tam - 1));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...