青蛙上台阶,可以一下跳1步,也可以一下跳2步,n层台阶所有跳法?
问题分析:
1. 该问题为斐波那契数列问题,问题的求解方法是对子问题的递归求解。
f(n)=f(n-1)+f(n-2)n>2,
f(1)=1,
f(2)=2.
2. 求解出所有解法,则需要用栈记录递归中的解法。
Java代码:
public class JavaTest {
int[] stack=new int[50];
int top;
int count;
boolean flag;
public void compute(int n){
if(n>0){
top=0;
count=0;
f(n);
}
int cc=0;
if(n==1)
cc=1;
else if(n==2)
cc=2;
else{
int a=1,b=2;
for(int i=3;i<=n;i++){
b=a+b;
a=b-a;
}
cc=b;
}
if(n>0){
if(flag||cc!=count)
System.out.println("count:\t"+count+"\tcc:\t"+cc+"\t"+(cc==count));
}
}
public void f(int n){
if(n<=0)
return;
else if(n==1){
// 当n=1时,只有一种走法,一下走一步
stack[top++]=1;
print();
top--;
}else if(n==2){
// 当n=2时,有两种走法,一下走两步,或者在走一步的基础上再走一步
stack[top++]=2;
print();
top--;
stack[top++]=1;
f(n-1);
top--;
}else{
// 在n-2的基础上走两步
stack[top++]=2;
f(n-2);
top--;
// 在n-1的基础上走一步
stack[top++]=1;
f(n-1);
top--;
}
}
public void print(){
count++;
if(flag){
System.out.println(count);
for(int i=top-1;i>=0;i--){
System.out.print(stack[i]+" ");
}
System.out.println();
}
}
public JavaTest(boolean flag){
this.flag=flag;
}
public static void main(String[] args) {
JavaTest jt=new JavaTest(true);
Print("Start...");
for(int i=0;i<10;i++)
jt.compute(i);
Print("End");
}
public static void Print(Object obj) {
System.out.println(String.valueOf(obj));
}
}
问题扩展:
兔子繁殖问题
下载地址:
http://download.csdn.net/download/ssuchange/6706099