我想使用递归找到数组的Maximum和Minimum元素。 这是我写的程序,我已经完成了逻辑,它看起来很完美。但是当我编译程序时,程序在输入后卡住了。
这是我的计划:
displayedFrame
答案 0 :(得分:3)
您的函数public class Movie
{
public List<String> title;
public List<String> director;
public List<DateTime> year;
...
}
和max
会导致无限递归。这会导致堆栈溢出。
你有:
min
使用递归方法的麻烦是int max(int a[],int n){
int maxo=0,i=0;
if(i<n){
if(maxo < a[i]){
maxo=a[i];
}
i++;
max(a,n);
}
return maxo;
}
在每次递归调用中都被初始化为i
。您使用0
这一事实不会影响下一次递归调用中i++
的值。同样,i
的值在每次递归调用中都设置为maxo
。
要使递归函数起作用,您需要在递归函数调用中传递0
和i
。类似的东西:
maxo
并使用以下命令调用该函数:
int max(int a[],int n, int i, int maxo){
if(i<n){
if(maxo < a[i]){
maxo=a[i];
}
return max(a, n, i+1, maxo);
}
return maxo;
}
对maxi = max(a, n, 0, a[0]);
的定义和min
的调用进行类似的更改。
答案 1 :(得分:2)
代码无限期递送
对OP代码进行了2次更改
#include <limits.h>
int max(int a[],int n){
//int maxo=0,i=0;
int maxo=INT_MIN,i=0; // Initialize maxo to the minimum int
if(i<n){
if(maxo < a[i]){
maxo=a[i];
}
i++;
// max(a,n);
// go to next element in the array, decrement array size.
// Without eventually reducing the array size, code recurses indefinitely.
// So here max() works on a 1 smaller array.
int m = max(a+1,n-1);
// save the greater one
if (m > maxo) maxo = m;
}
return maxo;
}
当循环更好时使用递归会给递归带来错误的名称。请考虑以下内容,即每次调用时将数组大小减半。最后,对n
的调用仍有大约max()
次,但递归深度仅为log2(n)
而不是n
。
int find_max(const int *a, size_t n) {
if (n <= 1) {
return (n == 0) ? INT_MIN : a[0];
}
int left = find_max(a, n/2);
int right = find_max(&a[n/2], n - n/2);
return left > right ? left : right;
}