递归是一种重要的编程思想,作用,特点,啥的我就不说了(没记住+不想码字?),这里我给出自己关于的一些见解以及运用递归思想简单实例。
一 递归思想的使用条件是什么?
递归思想要想在实际中去使用,必须满足以下条件
1 一个规模为n的问题可以分解为规模较小的问题(n-1或者n-i)的问题,并且较小规模的问题应该与规模为n的问题的解决方式相同。
2 当递归使问题规模下降到某个基本问题(如n=1,具体问题具体分析)时,应该给出该答案或者该答案应该容易求解。
二 递归函数应该如何撸出来呢?
我认为要撸出递归函数的代码,可以从能够运用递归思想解决的实例满足的递归条件角度思考。
1 形参。一般情况下都会给出问题规模这个参数,其他参数视情况而定
2 函数体。函数体内的主体结构是对问题规模n的处理的划分,就像数学中的分类讨论。需要给出两个讨论,一个为基本问题(如n=1)的处理办法,一个为非基本问题的处理办法
那非基本问题有很多可能(如n=2,3,i,n)为什么可以统一处理呢?这就是我上面提到的递归思想使用的条件中给出的这句话了 *一个规模为n的问题可以分解为规模较小的问题(n-1或者n-i)的问题,并且较小规模的问题应该与规模为n的问题的解决方式相同。
下面给出几个简单实例。
package recusion;
import java.util.Scanner;
public class n {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
System.out.println(function(num));
}
public static int function(int n) {// 函数作用:对给定的n求其阶乘。可以理解为一个规模为n的问题
if (n > 1) { // 给出了该问题当其规模n>1的情况下的转化为更小问题的解决方案,即转化为n*function(n-1)
return n * function(n - 1);
} else
return 1; // 给出了基本问题当n=1时的答案。
}
}
汉诺塔问题
package recusion;
import java.util.Scanner;
public class hanio {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
hanio('A','B','C',num);
}
public static void hanio(char a,char b,char c,int num){ //三个变量a,b,c表示把a中盘子通过b移到c,num是作为规模n的输入
if(num>1){ //给出规模大于1基本问题的求解
hanio(a,c,b,num-1);
System.out.println(a+"->"+c);
hanio(b,a,c,num-1);
}
else //给出了基本问题n=1的求解
System.out.println(a+"->"+c);
}
}
再补充先扔了再说