递归设计经验
- 找重复
- 找重复中的变化量——>参数
- 找参数变化趋势—>设计出口
对arr中的所有元素求和
package recursion;
/*
对arr中的所有元素求和
(要求用递归)
找重复:划分出数组中的第一个元素,
找变化:数组编号加加
找边界:当数组数达到第几个结束
*/
public class ARR {
public static void main(String[] args) {
int arr[]={1,2,3,4,5};
System.out.println(f1(arr,0));
}
static int f1(int arr[],int begin){
if(begin==arr.length){
return 0;
}
return arr[begin]+f1(arr,begin+1);
}
}
将f1函数当成一个结果, return arr[begin]+f1(arr,begin+1);
反转字符串
package recursion;
public class ReverseAString {
/*
反转字符串
*/
public static void main(String[] args) {
String s = "asffdf";
// char[] arr = s.toCharArray();
//
// for (int i = 0; i < arr.length; i++) {
// System.out.print(arr[6-1-i]);
// }
//递归
System.out.println(f1(s,s.length()-1));
}
static String f1(String s,int end){
if(end==-1){
return "";
}
return s.charAt(end)+f1(s,end-1);
//charAt(返回指定位置的字符 )
}
}
斐波那契数列
package recursion;
/*
斐波那契数列:
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377...
现输入一个数字n,输出第n个斐波那契数列
*/
public class Fibonacci {
public static void main(String[] args) {
System.out.println(f1(8));
}
static int f1(int n){
if(n==0){
return 0;
}
if(n==1){
return 1;
}
return f1(n-1)+f1(n-2);
}
}
在斐波那契数列求解中可以明显看出,采用递归算法会出现很多重复计算,所以在解题时用递归要考虑清楚
最大公约数
package recursion;
/*
辗转相除法
*/
public class gcd {
public static void main(String[] args) {
System.out.println(f1(96,36));
}
static int f1(int a,int b){
if(a%b==0){
return b;
}
return f1(b,a%b);
}
}