我想通过递归找到数组中的最大数, 这段代码有什么问题。
#include<stdio.h>
int find_max(int *a,int n){
int m_max;
if(n==1){
return a[0];
}
m_max=find_max(a,n-1);
if(a[n-1]>m_max)
m_max=a[n-1];
}
答案 0 :(得分:3)
正如@moffeltje所说,&#34;当n!= 1&#34;
时,没有回复 if(a[n-1]>m_max)
m_max=a[n-1];
return m_max; // add
}
这种线性方法为递归提供了一个错误的名称。如果有n
个数字,则最大递归深度为n
。最好将2分为最大深度log2(n)
int find_max(const int *a, int n) {
if (n <= 1) {
return a[0];
}
int left = find_max(a, n/2);
int right = find_max(&a[n/2], n - n/2);
return left > right ? left : right;
}
---次要内容
应对n < 1
或a == NULL
。
int find_max(const int *a, int n) {
if (n <= 1 || a == NULL) {
if (n <= 0 || a == NULL) return INT_MIN; // or throw error
return a[0];
}
...
更改int find_max(int *a, int n)
- &gt; int find_max(const int *a, int n)
允许传递常量数组。
数组大小最好输入size_t
而不是int
。
int find_max(const int *a, size_t n) {
...
}
答案 1 :(得分:1)
#include<stdio.h>
int find_max(int *a,int n){
int m_max;
if(n==1){
return a[0];
}
m_max=find_max(a,n-1);
if(a[n-1]>m_max)
m_max=a[n-1];
return m_max;
}
当n!= 1时你没有返回任何东西。 看看设计这些东西时,你应该经常检查 -
基本情况。在这种情况下,当n = 1时就会实现。(剩下一个元素,它是最大的元素)
递归案例。在这里,您将使用计算值来处理较小的案例,现在您将构建解决方案,认为已经计算过以前的案例。
合并合并计算结果。您提供的最后一个if条件。但是你忘了把一个没有结果的回报给别人。这就是出现这个问题的地方。
答案 2 :(得分:0)
或者,您可以简化功能。
int max_array_val( int* a_Array, int a_Size )
{
int max = a_Array[ 0 ];
for( int i = 1; i < a_Size; i++ )
if( a_Array[ i ] > max )
max = a_Array[ i ];
return max;
}
int main()
{
int int_array[ 6 ] = { 3, 2, 6, 5, 5, 2 };
printf( "Maximum number is: %i\n\n", max_array_val( int_array, sizeof( int_array ) / sizeof( int ) ) );
system( "pause" );
return 0;
}
答案 3 :(得分:0)
int getMax(int const * arr, int size) {
if (size == 1)
return *arr;
int ans = getMax(arr + 1, size - 1);
return *arr > ans ? *arr : ans;
}