【问题标题】:Searching an element in an Array using Recursive Function in C Language使用 C 语言中的递归函数搜索数组中的元素
【发布时间】:2019-11-11 02:44:22
【问题描述】:

我是递归数组的初学者,所以需要一些指导。 我试图找出一个元素是否存在于数组中。

// 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)

请指导我使用此代码做错了什么。

【问题讨论】:

    标签: c arrays function


    【解决方案1】:

    i++ 是一个后修复增量,它在评估包含它的表达式之后增加i。因此,对fooSearch 的每次调用都会有效地变为fooSearch(array1, N, 0, X)。递归是无止境的,因此是段错误(或我的编译器上的堆栈溢出)。 (您可以通过将printf("%d\n", i) 放在函数顶部来确认i 不变。)

    通过使用前缀增量来解决此问题,这会增加变量 before 评估。

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

    或者使用i+1,因为无论如何你都不会重用局部变量。

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

    【讨论】:

    • 非常感谢,我明白我犯的错误了。
    【解决方案2】:

    虽然调用 fooSearch() 递归传递 i+1 而不是 i++ 作为后增量 i++ 不会更改参数中的 i。例如

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

    【讨论】:

    • 非常感谢您的回答,您也可以指导我一些关于理解递归数组的教程。
    【解决方案3】:
    // 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;
    }
    
    
    

    【讨论】:

      【解决方案4】:

      查找一个元素是否存在于数组中。

      你可以初始化数组元素的数量,比如说 10 个元素:

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

      然后,创建 for 循环以检查数字 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;
      }
      
      

      【讨论】:

      • 非常感谢您的回复,我对递归和数组传递的使用感到困惑。您的回答对那些需要相同问题的迭代方法的人有所帮助。我很感激。
      【解决方案5】:

      您必须使用++ii+1 而不是i++

      i++ 是一个后自增运算符,因此将转到函数的i 的值不会改变。

      只需使用++ii+1,您就会得到答案。

      【讨论】:

        猜你喜欢
        • 2015-06-21
        • 2021-01-18
        • 1970-01-01
        • 1970-01-01
        • 2017-11-23
        • 2016-11-13
        • 2011-09-04
        • 1970-01-01
        • 2015-01-28
        相关资源
        最近更新 更多