C语言递归找最大值问题


#include <stdio.h>

int max_num(int a,int b)
{
   if (a>b) {
   return a;
   }
   else {
   return b;
   }
}
int find_max(int arr[],int min,int max)
{
   int mid,f;
    if (min == max) {
        return arr[min];
    }
   mid = (min+max)/2;
   int left_max = find_max(arr,min, mid);
   int right_max = find_max(arr,mid+1,max);
   return max_num(left_max,right_max);

} 

int main()
{int a ,b=2;
   int arr[] = {5, 8, 9, 5, 7,3 ,4};
   a = find_max(arr,0,6);
   printf("%d",a);
   return 0;}

img

img


就是因为➕min就有大问题,为什么会这样,min是0,加0为什么会出问题?求解答。

应该是
mid = (max-min)/2+min;

【以下回答由 GPT 生成】

问题分析及解决方案:

  1. 问题表现:代码中的递归函数在min等于max时会返回数组中对应索引位置为min的元素。
  2. 预期功能:代码应当返回数组中的最大值。
  3. 对C语言中递归函数和数组的理解程度:良好。
  4. 尝试过其他方法来解决这个问题:否。

问题原因: 在递归函数中,当min等于max时,意味着已经找到了数组的最后一个元素。根据代码的逻辑,在这种情况下应该返回最后一个元素的值,即arr[max]。然而,代码中返回的是arr[min],即数组的第一个元素。这是因为递归函数的参数列表中有一个形参min,它在递归调用时传递给下一次调用,但并没有在返回时更新为max。

解决方案: 在递归函数中,当min等于max时,要返回arr[max]而不是arr[min]。可以通过在基本案例中添加一个条件来实现:

if (min == max) {
    return arr[max];  // 返回最后一个元素的值
}

这样,在min等于max时就会返回arr[max],即数组中的最大值。修改后的完整代码如下:

#include <stdio.h>

int max_num(int a, int b)
{
   if (a > b) {
   return a;
   }
   else {
   return b;
   }
}

int find_max(int arr[], int min, int max)
{
   int mid,f;
    if (min == max) {
        return arr[max];  // 返回最后一个元素的值
    }
   mid = (min+max)/2;
   int left_max = find_max(arr, min, mid);
   int right_max = find_max(arr, mid+1, max);
   return max_num(left_max, right_max);
} 

int main()
{
   int a, b=2;
   int arr[] = {5, 8, 9, 5, 7, 3, 4};
   a = find_max(arr, 0, 6);
   printf("%d",a);
   return 0;
}

代码中的修改已经修复了问题,现在运行该代码将正确返回数组中的最大值。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^