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

时间:2012-08-07 12:38:57

标签: 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, 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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

您的终止条件适用于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;

答案 2 :(得分:0)

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

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

错了。

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

答案 3 :(得分:0)

错误的行:

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

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

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

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

并且在每个复发循环中,arraylength -1。

结束比较应为:

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