- 递归过程可以分为两个阶段:
1)递归过程:将原始问题不断转化为规模小了一级的新问题;
2)回溯问题:从已知条件出发,沿递归的逆操作,逐一求值返回,直至递归初始出,完成递归调用。 - 斐波那契数列:
如:1,1,2,3,5,8,13,21,34,…
这个数列第n想Fib(n)可定义如下:
Fib(n) = n, n=0,1
Fib(n) = Fib(n-1) +Fib(n-2) , n>=2
public class Fibo {
public static int fib(int n) {
if(n==0 || n==1)
return n;
else
return (fib(n-2) + fib(n-1));
}
public static void main(String[] args) {
int num = 6;
System.out.println(Fibo.fib(num));// TODO 自动生成的方法存根
}
}
- 汉诺塔问题
问题描述:有a、b、c三个底座,底座上可以放盘子。初始时,a座上有n个盘子,这些盘子大小各不相同,但大盘子在下,小盘子在上,依次排列,如下图所示。要求将a座上的n个盘子移至c座上,每次只能移动1个,并要求移动过程中小盘子在上,大盘子在下,可借助b座实现移动。
问题思路:
1)先将a座上n-1个盘子借助c移至b座;
2)再将a座上最下面一个盘子移至c座;
3)最后将b座上的n-1个盘子借助a移动至c座;
两个函数:
1)从一个底座上移动n个盘子到另一个底座;
2)总一个底座上移动一个盘子到另一个底座;
public class Hannuo {
void move(char a ,char c){
System.out.println("Move the top plate of " + a + "--->" + c );
}
void hanno(int n, char a, char b,char c) {
if(n==1)
move(a,c);
else {
hanno(n-1,a,c,b);
this.move(a, c);
hanno(n-1,b,a,c);
}
}
public static void main(String[] args) {
Hannuo a = new Hannuo();
int num = 3;
a.hanno( num, 'a', 'b', 'c');// TODO 自动生成的方法存根
}
}