【问题标题】:Use recursion to find the 1st occurrence of a target number in an array [closed]使用递归查找数组中目标数的第一次出现[关闭]
【发布时间】:2016-02-29 14:43:27
【问题描述】:

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

【问题讨论】:

  • 您绝对应该在ar 的取消引用之前移动if (n == 0) 检查。您还需要检查 -1 的递归调用的返回值。
  • 有什么问题?为什么您的代码不起作用?
  • @Charlie 如果目标号码不在数组中,则 rLookupAr() 将返回 –1。
  • 以后如果您不想被否决,请写出一个没有标准输入的完整示例。家庭作业问题可以,但请尊重社区时间,让问题易于理解并解释您自己尝试过的内容。

标签: c arrays search recursion


【解决方案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;
    }        
}

【讨论】:

    【解决方案2】:

    你的递归函数不能像发布的那样工作:

    如果目标号码不在数组中,则返回的索引为-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;
    }
    

    【讨论】:

      【解决方案3】:

      试试这个:

      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

      【讨论】:

        【解决方案4】:
        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);
        }
        

        【讨论】:

        • 恐怕您的代码无法编译:n &lt;= p 将指针与整数进行比较...如果目标不在数组中,如果数组。
        • 我的错 :( ,已更正。
        • 你的函数没有返回目标在数组中的索引,它只能返回1或者-1
        猜你喜欢
        • 2019-03-01
        • 1970-01-01
        • 2020-01-15
        • 1970-01-01
        • 2020-04-30
        • 1970-01-01
        • 2020-04-03
        • 2019-02-28
        • 1970-01-01
        相关资源
        最近更新 更多