0

我想使用递归找到数组的一个元素。该函数接受一个数组和目标值。递归函数检查它是否是给定数组的元素。但不幸的是,我无法在其上设置此代码。该函数始终返回 '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 ;

}
4

4 回答 4

3

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

于 2012-08-07T12:42:54.407 回答
0

您的终止条件是 when a[1] == '\0'。但是,您的数组不会以 0 结束。因此,您要在堆栈的其余部分之外搜索target 数组的边界。这是未定义的行为,所以任何事情都可能发生(你不能抱怨)。但是,在您的特定情况下,它恰好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;

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

     vvv
if (a[0] == 0)
    son = 0;
于 2012-08-07T12:43:37.983 回答
0

'a' 不是以空字符结尾的字符串,所以这里的测试:

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

是错的。

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

于 2012-08-07T12:43:53.610 回答
0

错误的线路:

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

int a[] 不以符号 '\0' 结尾,因此您的代码将访问非法内存。

for int a[], for function 应该定义如下:

int isElement(int *a, int arraylength, int target) ;

并且在每个递归循环中,arraylength -1。

结束的比较应该是:

if(arraylength == 1 && a[0] != target)
son = 0;
于 2012-08-07T12:50:47.620 回答