Поиск элемента в массиве с использованием рекурсивной функции на языке Си - PullRequest
0 голосов
/ 29 июня 2019

Я новичок в рекурсивных массивах, поэтому мне нужно некоторое руководство. Я пытаюсь найти, присутствует ли элемент в массиве или нет.

// Program to find whether an element exist in an array or not.
#include <stdio.h>
int arr[5]= {1,2,3,4,5};

int fooSearch(int array1[],int N,int i, int X)
{
    if(i==N)
      return 0;
    else if (array1[i]==X)
      return 1;
    else 
      return fooSearch(array1,N,i++,X); 
}

// N denotes total size 5
// i counter that moves from 0 to 4 and eliminate recursion when it reaches 5
// X is the element to be found


int main() {
    fooSearch(arr,5,0,3);
    return 0;
}

Я получил ошибку Segmentation Fault (SIGSEGV).

Пожалуйста, объясните мне, что я не так делаю с этим кодом.

Ответы [ 4 ]

2 голосов
/ 29 июня 2019

i++ - это инкремент после исправления, который увеличивает i после на выражение, содержащее его.Таким образом, каждый вызов fooSearch фактически превращается в fooSearch(array1, N, 0, X).Рекурсия бесконечна, отсюда и ошибка (или переполнение стека в моем компиляторе).(Вы можете подтвердить, что i остается неизменной, поместив printf("%d\n", i) в верхнюю часть функции.)

Исправьте это, используя приращения с предварительным исправлением, которые увеличивают переменную до оценки .

return fooSearch(array1, N, ++i, X); 

Или используйте i+1, поскольку вы все равно не будете повторно использовать локальную переменную.

return fooSearch(array1, N, i+1, X); 
1 голос
/ 29 июня 2019

чтобы найти, присутствует ли элемент в массиве или нет.

вы можете инициализировать количество элементов массива, скажем, 10 элементов:

int num[10]= {2,3,5,6,1,8,4,9,0,7};

Затем, Создание для цикла для проверки, не находится ли число 9 в массиве, затем продолжайте до тех пор, пока условие не станет ложным, затем выведите местоположение элемента.

  for(i=0; i<10; i++){

    if(num[i] != 9){
      continue;
    }

    printf("9 is found here\n%d",i);
    break;
  }

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

  if(i==10){
    printf("Not Found");
  }

Полный код здесь:

#include <stdio.h>


int num[10]={2,3,5,6,1,8,4,9,0,7};
int i;

int main(void){

  for(i=0; i<10; i++){

    if(num[i] != 9){
      continue;
    }

    printf("9 is found here\n%d",i);
    break;
  }

  if(i==10){
    printf("Not Found");
  }

  getchar();
  return 0;
}

1 голос
/ 29 июня 2019

При вызове fooSearch() рекурсивно передайте i+1 вместо i++, так как постинкремент i++ не меняет i в аргументе.Например,

fooSearch(array1,N,i+1,X); 
0 голосов
/ 29 июня 2019
// Program to find whether an element exist in an array or not.
// Number of elements of array is N, the number to search is X
#include <stdio.h>
int arr[]= {1,2,3,4,5};

int fooSearch(int array1[],int N,int i, int X)
{   if(i==N)
      return 0;
    else if (array1[i]==X)
      return 1;
    else 
      i=i+1;
      return fooSearch(array1,N,i,X); 
}

int main() {
int x = fooSearch(arr,5,0,9);
printf("%d",x);
return 0;
}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...