代码可以返回目标号码的位置。但是,如果目标编号不在数组中,则还应该返回-1。我还应该只使用递归。
以下是代码:
#include <stdio.h>
int rLookupAr(int ar[], int n, int target);
int main() {
int a[80];
int target, i, size;
printf("Enter array size: ");
scanf("%d", &size);
printf("Enter %d numbers: ", size);
for (i = 0; i < size; i++)
scanf("%d", &a[i]);
printf("Enter target number: ");
scanf("%d", &target);
printf("rLookupAr(): %d", rLookupAr(a, size, target));
return 0;
}
int rLookupAr(int ar[], int n, int target) {
/* write your code here */
if (ar[0] == target) {
if (n == 0)
return -1;
else
return 0;
} else
return 1 + rLookupAr(ar + 1, n - 1, target);
}
答案 0 :(得分:1)
该功能可以看起来像
int rLookupAr( const int ar[], int n, int target )
{
if ( n < 1 )
{
return -1;
}
else if ( ar[0] == target )
{
return 0;
}
else
{
int i = rLookupAr( ar + 1, n - 1, target );
return i == - 1 ? i : i + 1;
}
}
答案 1 :(得分:0)
您的递归函数无法按照发布的方式工作:
如果目标数字不在数组中,则返回的索引将为-1
,但除非数组为空,否则此返回值将被所有递归调用抵消,最终返回值将为数组的长度 - 1,错误地指向最后一个数组条目。
您应该以这种方式修改代码:
int rLookupAr(int ar[], int n, int target) {
if (n <= 0)
return -1;
if (ar[0] == target)
return 0;
int res = rLookupAr(ar + 1, n - 1, target);
if (res < 0)
return res;
else
return res + 1;
}
请注意,这种递归非常低效,如果数组足够大且目标足够远或不存在,将导致堆栈溢出。
仍然使用递归但深度有限的替代方案将拆分数组并递归每一半:
int rLookupAr(int ar[], int n, int target) {
if (n <= 0)
return -1;
int m = n / 2;
if (ar[m] == target)
return m;
int res = rLookupAr(ar, m, target);
if (res >= 0)
return res;
res = rLookupAr(ar + m + 1, n - m - 1, target);
if (res >= 0)
return res + m + 1;
else
return -1;
}
答案 2 :(得分:0)
试试这个:
int rLookupAr(int *ar, int n, int target)
{
if (n == 0) return -1;
if (ar[0] == target) return 0;
int _ret = rLookupAr(ar + 1, n - 1, target);
if(_ret != -1) return ++_ret;
else return -1;
}
我看到弗拉德已经建议了,所以......
看到它的实际效果:https://ideone.com/LhovTh
答案 3 :(得分:0)
int targ_pos( const int *p, int n, int target)
{
if(*p == target){return 1;}
if(n == 1){return -1;}
return targ_pos(p+1, --n, target);
}