DEBUG了一下才看出来,递归坑人啊。。。
成都创新互联公司10多年成都企业网站定制服务;为您提供网站建设,网站制作,网页设计及高端网站定制服务,成都企业网站定制及推广,对成都三维植被网等多个行业拥有丰富的网站营销经验的网站建设公司。
也建议你用DEBUG跟踪一下。。
首先这里递归了几次
float rmax = 0, rmin = 0, bmax = 0, bmin = 0;
mid = (i + j) / 2;
maxMin(i, mid, a, rmax, rmin);
当i=0,mid=1的时候,上面几行代码的最后一行执行完成,并输出了最大最小值。
之后这个一行执行完了继续往下执行,造成死循环
即i=2,j=1
分治那个方法基本都错了:
import java.util.*;
public class Maxmin {
public int max=0;
public int min=Integer.MAX_VALUE;
public int Min(int a, int b){
if(a=b)
return a;
else
return b;
}
public int Max(int a, int b){
if(a=b)
return a;
else
return b;
}
public void min_max(int a[]){
if (a.length == 1) {
max = Max(max, a[0]);
min = Min(min, a[0]);
} else {
int m[] = new int[a.length / 2];
int n[] = new int[a.length - a.length / 2];
System.arraycopy(a, 0, m, 0, m.length);
System.arraycopy(a, m.length, n, 0, n.length);
min_max(m);
min_max(n);
}
}
public static void main(String []args){
Maxmin object= new Maxmin();
int[] array = new int[100];
for(int i=0; iarray.length; i++)
{
array[i]=(int) (Math.random()*100+1);
System.out.print(array[i]+" ");
}
object.min_max(array);
System.out.println("最大值是:"+object.max);
System.out.println("最小值是:"+object.min);
}
}
这是分治求最大子数组和
首先重要点是:递归,这个是关键,何为递归,就是自己调用自己,比如这个代码中的helper方法,就是递归,该代码运行时,会自己调用自己很多次,数组就会两分,两分再两分,这样就会把大的问题分解成小的问题,最后把小的问题汇集起来得到答案。
你表达不出的东西和没理解的就是这个递归,别小看这个递归,这是本代码的关键点,最重要的部分。
以下是使用分治法求x的n次方的Java程序:
Copy code
public class Power {
public static void main(String[] args) {
double x = 2.0; // 底数
double n = 10; // 指数
double result = power(x, n);
System.out.println(x + " 的 " + n + " 次方为:" + result);
}
// 分治法求幂运算
public static double power(double x, double n) {
if (n == 0) { // n为0时,直接返回1
return 1;
}
double half = power(x, n / 2);
if (n % 2 == 0) { // n为偶数时,两半乘起来即可
return half * half;
} else { // n为奇数时,需要多乘一次x
return half * half * x;
}
}
}
首先,在 main() 方法中定义了底数 x 和指数 n。然后调用 power() 方法求 x 的 n 次方,并将结果输出到屏幕上。
power() 方法使用了分治法来实现幂运算。当 n 是0时,直接返回1;否则将 n 分成两半,分别递归求出两半的幂,然后根据 n 是奇数还是偶数来计算结果,最后返回计算结果。
由于每次递归将 n 除以2,因此该算法的时间复杂度为 Θ(lgn)。