在c中使用递归查找数组元素

在c中使用递归查找数组元素,c,function,recursion,C,Function,Recursion,我想通过递归找到数组的一个元素。这个函数接受一个数组和目标值。递归函数检查它是否是给定数组的元素。但不幸的是,我无法在上面设置此代码。该函数总是重新运行“1”。我在哪里犯错误 #include <stdio.h> int isElement(int *a, int target) ; int main() { int a[] = {3,5,6,4,2,32,15} ; int target = 12 ,res ; res = isElement( a, tar

我想通过递归找到数组的一个元素。这个函数接受一个数组和目标值。递归函数检查它是否是给定数组的元素。但不幸的是,我无法在上面设置此代码。该函数总是重新运行“1”。我在哪里犯错误

#include <stdio.h>

int isElement(int *a, int target) ;

int main()
{

  int a[] = {3,5,6,4,2,32,15} ;
  int target = 12 ,res  ;


  res = isElement( a, target) ;

  if(res==1)
    printf("its an element of the array\n");

  if(res==0) 
    printf("its not an element of the array\n");

  return 0 ;
}


int isElement(int *a, int target)
{
  int son=0  ;


  printf("array = %d\n",a[0] );

  if(a[1] == '\0')
      son = 0 ;

  else if(target == a[0])
    son = 1 ; 

  else
    son = isElement(&a[1] ,target);

  return son ;

}
#包括
int i元素(int*a,int目标);
int main()
{
int a[]={3,5,6,4,2,32,15};
int目标=12,分辨率;
res=isElement(a,目标);
如果(res==1)
printf(“它是数组的一个元素\n”);
如果(res==0)
printf(“它不是数组的元素\n”);
返回0;
}
int iElement(int*a,int目标)
{
int-son=0;
printf(“数组=%d\n”,a[0]);
如果(a[1]='\0')
son=0;
else if(目标==a[0])
son=1;
其他的
son=isElement(&a[1],目标);
归子;
}

a不是字符串,因此不存在空终止符('\0')。您需要传递数组长度,否则此函数将在内存中永远继续(直到找到它)。

a不是字符串,因此没有空终止符('\0')。您需要传递一个数组长度,否则此函数将在内存中永远继续(直到找到它)。

终止条件是当
a[1]=='\0'
时。但是,数组不会以0结尾。因此,您正在堆栈其余部分的数组边界外搜索
目标。这是未定义的行为,所以任何事情都有可能发生(你不能抱怨)。但是,在您的特定情况下,
target
恰好放在堆栈上的
a
之后,因此一旦退出
a
,您就会看到与您所查找的值相同的值,因此总是返回1

您应该做的是将
a
的定义更改为:

int a[] = {3,5,6,4,2,32,15, 0} ;
                           ^^^
此外,条件:

if(a[1] == '\0')
      son = 0 ;
在这种情况下,会给您错误的结果:

int a[] = {12, 0};
int target = 12;
因为在检查[0]==target
之前,您将此案例标记为失败。因此,您应将条件更改为:

     vvv
if (a[0] == 0)
    son = 0;

您的终止条件是当
a[1]='\0'
时。但是,数组不会以0结尾。因此,您正在堆栈其余部分的数组边界外搜索
目标。这是未定义的行为,所以任何事情都有可能发生(你不能抱怨)。但是,在您的特定情况下,
target
恰好放在堆栈上的
a
之后,因此一旦退出
a
,您就会看到与您所查找的值相同的值,因此总是返回1

您应该做的是将
a
的定义更改为:

int a[] = {3,5,6,4,2,32,15, 0} ;
                           ^^^
此外,条件:

if(a[1] == '\0')
      son = 0 ;
在这种情况下,会给您错误的结果:

int a[] = {12, 0};
int target = 12;
因为在检查[0]==target
之前,您将此案例标记为失败。因此,您应将条件更改为:

     vvv
if (a[0] == 0)
    son = 0;

“a”不是以null结尾的字符串,因此此处的测试:

if(a[1] == '\0')
  son = 0 ;
这是错误的


您的函数返回1,因为它一直读取超过调用未定义行为的数组末尾的数据。在另一台计算机上,我编译并运行了它,函数返回0。在我的机器上,程序找不到12。但是,在您的机器上,它的行为不同。这是未定义行为的结果

“a”不是以null结尾的字符串,因此此处的测试:

if(a[1] == '\0')
  son = 0 ;
这是错误的

您的函数返回1,因为它一直读取超过调用未定义行为的数组末尾的数据。在另一台计算机上,我编译并运行了它,函数返回0。在我的机器上,程序找不到12。但是,在您的机器上,它的行为不同。这是未定义行为的结果

错误行:

  if(a[1] == '\0')
      son = 0 ;
int a[]未以符号“\0”结尾,因此您的代码将访问非法内存

对于int a[],for函数的定义如下:

int isElement(int *a, int arraylength, int target) ;
在每个recurion循环中,排列长度为-1

最终比较应为:

if(arraylength == 1 && a[0] != target)
son = 0;
错行:

  if(a[1] == '\0')
      son = 0 ;
int a[]未以符号“\0”结尾,因此您的代码将访问非法内存

对于int a[],for函数的定义如下:

int isElement(int *a, int arraylength, int target) ;
在每个recurion循环中,排列长度为-1

最终比较应为:

if(arraylength == 1 && a[0] != target)
son = 0;

非常感谢你,我的朋友。我只记得老师说过空字符。。它工作得很好。非常感谢:)非常感谢你,我的朋友。我只记得老师说过空字符。。它工作得很好。非常感谢:)在现实世界的应用程序中,您不会为此使用递归。一个更有用且相关的递归算法是使用二进制搜索在排序数组中查找元素。在实际应用程序中,您不会为此使用递归。一个更有用且相关的递归算法是使用二进制搜索在排序数组中查找元素。如果target=0或A[]有一个元素0,则它将是错误的。@aasa,“以0结尾的数组”不能有元素0。这就是我根据OP的解决方案对
a
提出的要求。如果在字符串中搜索
'\0'
,则会出现相同的问题。我同意给出数组的长度是一个更好的解决方案。然而,我写这篇文章是因为OP就是这样解决问题的,谁知道呢,也许
0
不会发生。如果target=0或a[]有一个元素0,那么它就错了。@aasa,“0终止数组”不能有元素0。这就是我根据OP的解决方案对
a
提出的要求。如果在字符串中搜索
'\0'
,则会出现相同的问题。我同意给出数组的长度是一个更好的解决方案。然而,我写了这篇文章,因为OP就是这样解决问题的,谁知道呢,也许
0
不会发生。