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