一 递归思想的使用条件是什么? 递归思想要想在实际中去使用,必须满足以下条件
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); } }再补充先扔了再说