1.递归求数组中最大值
package yy.digui;
public class Max {
public static void main(String[] args) {
// 用递归求一个整数数组a中的最大值
int i = 0;
int max = 0;
int[] a = {9, 3, 10, 2, 6, 2, 19};
i = a.length;
max = f(a, i);
System.out.println(max);
}
static int f(int[] a, int i){
if(i == 1){
return a[0];
}else{
return Math.max(f(a, i-1), a[i - 1]);
}
}
}
运行结果:19
2.递归求begin到end索引处的数组之和
package yy.digui;
public class Sum {
//从begin项开始到end项的和
public static void main(String[] args) {
int[] a = {1, 2, 3, 4, 5, 6};
int sum = 0;
// sum = f(a, 5);
sum = f(a, 0, 5);
System.out.println(sum);
}
//从begin到最后一项的和
/*public static int f(int[] a, int begin){
int sum = 0;
if(begin == a.length){
return 0;
}else{
sum = f(a, begin + 1);
return sum = sum + a[begin];
}
}*/
//从第一项到end项的和
/*public static int f(int[] a, int end){
int sum = 0;
if(end < 0){
return 0;
}else
sum = f(a, end-1);
return sum += a[end];
} */
//从begin项开始到end项的和
/*private static int f(int[] a, int begin, int end) {
int sum = 0;
if(begin > end){
return 0;
}else{
sum = f(a, begin, end-1);
return sum += a[end];
}
}*/
//从begin项开始到end项的和
private static int f(int[] a, int begin, int end){
int sum = 0;
if(begin > end){
return 0;
}else{
sum = f(a, begin+1, end);
return sum += a[begin];
}
}
}
运行结果:21
3.不放回取球
package yy.digui;
public class Getball {
public static void main(String[] args) {
int x = f(10, 3);
System.out.println(x);
}
//n个球中取m个球(不放回),有多少种取法
public static int f(int n, int m){
//如果取得球数大于总球数,则没有取法
if(n < m){
return 0;
}
//如果取得球数等于总球数,则只有一个取法
if(n == m){
return 1;
}
//取的球数为0,则只有一个取法
if(m == 0){
return 1;
}
//设有一个球是我们想要取的球, 可能有两个情况,第一个情况 球已经被我们取了,剩下只要在n-1个球中取m-1个,另一个情况是没取到想要的球, 即 在剩下的n-1个球取 m个球
return f(n - 1, m - 1) + f(n - 1, m);
}
}
运行结果:120