【问题标题】:recursive function to locate last occurence of an element递归函数来定位元素的最后一次出现
【发布时间】:2020-05-05 03:25:57
【问题描述】:

我正在尝试用 C 编写递归函数,

给定一个数组、数组的大小以及元素 int 目标,我想找到 int 目标最后一次出现的索引。

#include <stdio.h>
int rLookupAr(int array[], int size, int target);
int main()
{
   int numArray[80];
   int target, i, size;

   printf("Enter array size: \n");
   scanf("%d", &size);
   printf("Enter %d numbers: \n", size);      
   for (i=0; i < size; i++)
      scanf("%d", &numArray[i]);
   printf("Enter the target number: \n");
   scanf("%d", &target);
   printf("rLookupAr(): %d", rLookupAr(numArray, size, target));
   return 0;
}
int rLookupAr(int array[], int size, int target)
  {
  }

但是,我已经被困了好几个小时了。

我是递归函数的初学者,非常感谢任何帮助!

一些例子:

Enter array size:
5
Enter 5 numbers:
2 1 3 2 4
Enter the target number:
2
rLookupAr(): 3

【问题讨论】:

  • 您是否热衷于使用尾递归或“正常”递归的方法?请注意,后者的堆栈内存使用不合理,如果您不小心,可能会导致堆栈溢出。
  • 请将此处示例的所有输入替换为固定值。无论如何,rLookupAr 是做什么的?里面没有一行代码!
  • 我可能会使用某种修改后的二分搜索。
  • rLookupAr 是我需要写的递归函数,但我卡住了
  • 您是否在课堂上学习过“纯函数式”语言和理论?如果您考虑一下 head()tail() 在类似 Lisp 的语言中的工作方式,它可能会有所帮助。 en.wikipedia.org/wiki/CAR_and_CDR

标签: c


【解决方案1】:
  • 如果您在最后一次出现之后,则可以在数组末尾开始搜索并向后工作。
  • C 数组由指向任何元素的指针和长度或索引上限值(您拥有)引用。
  • 查看递归函数的一种方法是询问“算法的每一步是否只是重复整个事情,只是在输入数据的递减子集上重复?” - 考虑处理树(其中每个子节点本身就是一棵树)或快速排序等操作(每个枢轴为您提供另外两个子部分,您可以再次进行枢轴,等等)等问题。
  • 考虑在[0...N] 的数组中查找值与通过检查[0] 然后检查[1...N] 来查找值相同,然后通过检查[1] 然后检查@987654325 再次重复自己@...希望您看到了一种新模式。
  • 对于向后工作,给定数组的开始和长度N,您应该先检查[N],然后用范围[0..(N-1)] 重复,然后检查[N-1],然后用[0...(N-2)] 重复。

我希望这将使您能够在我不给您答案的情况下找到解决方案。

【讨论】:

  • 谢谢!
【解决方案2】:

您可以定义rLookupAr() 函数如下。查看完整的工作代码here

int rLookupAr(int array[], int size, int target)
{
    if(size < 1) return -1;

    size--;
    if(array[size] == target) return size;

    return rLookupAr(array, size,target);
}

注意:如果在array数组中找不到target值,rLookupAr()函数将返回-1

输出

Enter array size: 5
Enter 5 numbers: 2 1 3 2 4
Enter the target number: 2 
rLookupAr(): 3

以下是完整代码:

#include <stdio.h>
int rLookupAr(int array[], int size, int target);
int main()
{
   int numArray[80];
   int target, i, size;

   printf("Enter array size: \n");
   scanf("%d", &size);
   printf("Enter %d numbers: \n", size);      
   for (i=0; i < size; i++)
      scanf("%d", &numArray[i]);
   printf("Enter the target number: \n");
   scanf("%d", &target);
   printf("rLookupAr(): %d", rLookupAr(numArray, size, target));
   return 0;
}

int rLookupAr(int array[], int size, int target)
{
    if(size < 1) return -1;

    size--;
    if(array[size] == target) return size;

    return rLookupAr(array, size,target);
}

【讨论】:

    【解决方案3】:

    请在下面找到递归函数:

    int rLookupAr (int array[], int size, int target)
    {
        if(size<=0)   return -1;
    
        if(array[size-1] == target)
            return size-1;
        else
            return rLookupAr (array, size-1, target); //recurse
    
    }
    

    基本上,函数从末尾开始,因为正在寻找最后一次出现。根据是否找到目标,它会进一步向下递归数组。

    完整代码:

    #include <stdio.h>
    int rLookupAr (int array[], int size, int target);
    
    
    int
    main ()
    {
      int numArray[80];
      int target, i, size;
    
      printf ("Enter array size: \n");
      scanf ("%d", &size);
      printf ("Enter %d numbers: \n", size);
      for (i = 0; i < size; i++)
        scanf ("%d", &numArray[i]);
    
      printf ("Enter the target number: \n");
      scanf ("%d", &target);
    
      printf ("rLookupAr(): %d", rLookupAr (numArray, size, target));
      return 0;
    }
    
    int
    rLookupAr (int array[], int size, int target)
    {
        if(size<=0)   return -1;
    
        if(array[size-1] == target)
            return size-1;
        else
            return rLookupAr (array, size-1, target); //recurse
    
    }
    

    输出:

    Enter array size: 
    5
    Enter 5 numbers: 
    2
    1
    3
    2
    4
    Enter the target number: 
    2
    rLookupAr(): 3
    

    【讨论】:

    • 您的rLookupAr 实现不执行参数验证,如果我用size == 0array = NULL 调用您的rLookupAr,它将遇到未定义行为。
    【解决方案4】:

    这是一个单语句的解决方案:

    int rLookupAr(int array[], int size, int target) {
        return size-- <= 0 ? -1 : array[size] == target ? size : rLookup(array, size, target);
    }
    

    对这样的简单案例使用递归解决方案仅作为练习。 C 编译器不需要执行尾递归优化来将此代码转换为循环,因此这种递归实现很容易导致中等大数组的堆栈溢出

    【讨论】:

      【解决方案5】:

      我是递归函数的初学者

      递归函数因线性归约而名声不佳。

      改为将问题分解为 2 以实现 log2(n) 的递归深度。

      int rLookupAr(int array[], int size, int target) {
         if (size < 1) {
           return -1;
         }
         int mid = size/2;
         int right = rLookupAr(array + mid, size - mid, target);
         if (right != -1) {
           return right + mid;
         }
         int left = rLookupAr(array, mid, target);
         return left;
      }
      

      【讨论】:

        【解决方案6】:
        int rLookupAr(int input[], int size, int x) {
          /* Don't write main().
             Don't read input, it is passed as function argument.
             Return output and don't print it.
             Taking input and printing output is handled automatically.
          */
        
            if(size==0)
            {
                return -1;
            }
                //return -1;
            int ans=lastIndex(input+1,size-1,x);
            if(ans!=-1)
            {
                return ans+1;
            }
            else{
                 if(input[0]==x)
                 {
                     return ans+1;
                 }
                else
                {
                    return -1;
                }
            }
        }
        

        【讨论】:

          【解决方案7】:
          int lastIndex(int input[], int size, int x)
          {
              if (size == 0)
              {
                return -1;
              }
          
              int answer = lastIndex(input + 1, size - 1, x);
          
              if (answer != -1)
              {
                return answer + 1;
              }
          
              if (input[0] == x)
              {
                return 0;
              }
              else
              {
                return -1;
              }
          }
          
          int main()
          {
            int input[] = {9, 8, 10, 8};
            int x = 8;
            int size = 4;
            cout << lastIndex(input, size, x);
            return 0;
          }
          

          【讨论】:

            猜你喜欢
            • 2015-06-06
            • 2021-08-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-04
            • 2023-03-12
            • 2021-12-25
            • 2021-11-15
            相关资源
            最近更新 更多