递归题目的解题关键:
1.终止条件是什么?
2.递归条件是什么?
3、递归与循环的区别:
递归:
代码行数少;
逻辑比较清楚;
理解比较困难;
浪费的空间比较多,数据大的情况下会出现栈溢出的现象;
循环:
理解起来比较 简单;
代码量多;
不会浪费大量的空间;
例1:打印1,2,3,4,5
public class TestDemo {
public static void func(int n) {
if (n == 1) {
System.out.println(n);
return;
}
func(n - 1);
System.out.println(n);
}
public static void main(String[] args) {
func(5);
}
}
例2:打印5的阶乘
public class TestDemo {
public static int func(int n){
if(n == 1){
return 1;
}
int tmp = n*func(n-1);
return tmp;
}
public static void main(String[] args) {
System.out.println(func(5));
}
}
例3:按顺序打印每个数字的每一位,例如123打印1 2 3
public class TestDemo {
public static void func(int n){
if(n<=9){
System.out.println(n);
return;
}
func(n/10);
System.out.println(n%10);
}
public static void main(String[] args) {
func(123);
}
}
例4:计算1+2+3+....+n
public class TestDemo {
public static int sum(int n){
if(n==1){
return 1;
}
int tmp = n + sum(n-1);
return tmp;
}
public static void main(String[] args) {
System.out.println(sum(4));
}
}
例5:输入一个非负整数,返回组成它的数字之和。如:输入123,返回1+2+3
public class TestDemo {
public static int sumevery(int n){
if(n<=9){
return 1;
}
int tmp = n%10+sumevery(n/10);
return tmp;
}
public static void main(String[] args) {
System.out.println(sumevery(123));
}
}
例6:递归逆序打印数组的每一个元素
法一:
public class TestDemo {
public static void print(int[] array,int len){
if(len == 1){
System.out.println(array[len-1]);
return;
}
System.out.println(array[len-1]);
print(array,len-1);
}
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
print(array,array.length);
}
}
法二:
public class TestDemo {
public static void print2(int[] array,int len){
if(len == array.length-1){
System.out.println(array[len]);
return;
}
print2(array, len+1);
System.out.println(array[len]);
}
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
print2(array,0);
}
}
例7:求斐波那契数列
法一:
public class TestDemo {
public static int fib1(int n){
if(n==1){
return 0;
}
if(n==2){
return 1;
}
int tem = fib1(n-1)+fib1(n-2);
return tem;
}
public static void main(String[] args) {
System.out.println(fib1(30));
}
}
法二:用循环解决
public class TestDemo {
public static int fib2(int n){
if(n==1){
return 0;
}
if(n==2){
return 1;
}
int f1 = 0;
int f2 = 1;
int f3 = 0;
for(int i = 3;i<=n;i++){
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f3;
}
public static void main(String[] args) {
System.out.println(fib2(30));
}
}