使用递归查找数组中第一次出现的目标数

时间:2016-02-29 14:43:28

标签: c arrays search recursion

代码可以返回目标号码的位置。但是,如果目标编号不在数组中,则还应该返回-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);
}

4 个答案:

答案 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);
}