面试题,大家看看如何来解决。我的答案如下,应该有更好的 爬楼梯: 一个楼梯有n阶,每次可以爬一阶或者二阶。比如,一个楼梯只有三阶,则共有3种爬法:
   1) 第一次爬一阶,第二次爬两阶。
   2)第一次爬一阶,第二次爬一阶,第三次爬一阶。
   3)第一次爬两阶,第二次爬一阶。
   问:如果楼梯是5阶,共有多少中爬法,并把每种爬法打印出来。请用程序实现。
(1)  8  种
public static void count(){
for(int i=1;i<=4;i++){//总会有1步出现,根据1出现的次数组合

switch(i){
case 1:
    System.out.println("方法(1),1,2,2");
    System.out.println("方法(2),2,2,1");
    System.out.println("方法(3),2,1,2");
    break;
case 2://与1步出现三次一样
    System.out.println("方法(4), 1,1,1,2");
    System.out.println("方法(5), 1,1,2,1");
    System.out.println("方法(6), 1,2,1,1");
    System.out.println("方法(7), 2,1,1,1");
 break;
case 4://与1步出现5次一样
    System.out.println("方法(8), 1,1,1,1,1");
 break;
}
}
}

解决方案 »

  1.   

    n阶梯 , n个1, 用2替换1 ,排列组合出所有可能性,再把每种可能性里的所有元素相加 到超过n 停止, 瞎想的,程序我不会 ,呵呵
      

  2.   

    public class Stair
    {
    private static int[] x;
    private static int count = 0;

    public static void climb(int n,int i)
    {
    if (n <= 0) {
    System.out.printf("%-4d:",++count);
    for (int step = 0;step < i;++step) {
    System.out.printf("%-3d",x[step]);
    }
    System.out.println();
    } else {
    for (int step = 1;step <= 2;++step) {
    if (n - step >= 0) {
    x[i] = step;
    climb(n - step,i + 1);
    x[i] = 0;
    }
    }
    }
    }

    public static void init(int n)
    {
    x = new int[n];
    for (int i = 0;i < x.length;++i) {
    x[i] = 0;
    }

    count = 0;
    }

    public static void main(String[] args)
    {
    init(5);
    climb(5,0);
    }}
      

  3.   


    public class Test
    {
    static Stack<Integer> s=new Stack<Integer>();
    public static void main(String...args){
    String[] s=new String[4];
    s[0]="dd";
    String[] s2={"aaa"};
    outPut(5);
    }
    public static void outPut(int n){
    if(n==0){
    System.out.println(s);
    }
    if(n==1){
    s.push(1);
    System.out.println(s);
    s.pop();
    }
    if(n==2){
    s.push(2);
    outPut(n-2);
    s.pop();

    s.push(1);
    outPut(n-1);
    s.pop();

    }
    if(n>2){
    s.push(1);
    outPut(n-1);
    s.pop();

    s.push(2);
    outPut(n-2);
    s.pop();
    }
    }
    }
      

  4.   

    修改下public class Test
    {
    static Stack<Integer> s=new Stack<Integer>();
    public static void main(String...args){
    outPut(5);
    }
    public static void outPut(int n){
    if(n==1){
    s.push(1);
    System.out.println(s);
    s.pop();
    }
    if(n==2){
    s.push(2);
    System.out.println(s);
    s.pop();

    s.push(1);
    outPut(n-1);
    s.pop();

    }
    if(n>2){
    s.push(1);
    outPut(n-1);
    s.pop();

    s.push(2);
    outPut(n-2);
    s.pop();
    }
    }
    }
      

  5.   

    楼上的不错,看来我用list有点绕弯了。
      

  6.   

    public static void main(String[] args) {
    printf("", 5);
    }

    public static void printf(String str, int number) {
    if (number == 1) {
    System.out.println(str + "1");
    return;
    } else if (number == 0) {
    System.out.println(str);
    return;
    }
    printf(str + "1", number - 1);
    printf(str + "2", number - 2);
    }
      

  7.   

    用递归
    f(n)=f(n-1)+f(n-2)
    迈到第N阶,或是由N-1过来或是N-2过来
      

  8.   

    用STRINGBUFFER的反序方法
    NB的应该用循环代替递归,这个数小估计不是考察的目的
      

  9.   

    用递归的方法实现.
    说来惭愧
    这题我做了一个下午..
    老师讲的课我都没听..public class ClimbLadderDemo {

    private int count;
    private StringBuffer buffer = new StringBuffer();

    public static void main(String[] args) {

    ClimbLadderDemo client = new ClimbLadderDemo();
    client.climbLadder(5, new StringBuffer());
    System.out.println("总共有" + client.count + "种结果:");
    System.out.println(client.buffer);

    }

    public void climbLadder(int num, StringBuffer buffer) {

    if(num <= 0) {
    buffer.append("\n");
    this.buffer.append(buffer);
    count++;
    return;
    }
    if(num == 1) {
    buffer.append("1 ");
    climbLadder(num - 1, new StringBuffer(buffer));
    return;
    }

    climbLadder(num - 2, new StringBuffer(buffer).append("2 "));
    climbLadder(num - 1, new StringBuffer(buffer).append("1 "));

    }}
      

  10.   

    这种类型的题,一般都是递归    public static int g(int n) {
            return g(0, n, new int[n]);
        }    private static int g(int c, int total, int[] arr) {
            if (total == 0) {
                for (int i = 0; i < c; i++) {
                    System.out.print(arr[i]);
                }
                System.out.println();
                return 1;
            }
            int x = 0;
            for (int i = 1; i <= 2 && total - i >= 0; i++) {
                arr[c] = i;
                x += g(c + 1, total - i, arr);
            }
            return x;
        }
      

  11.   

    来个循环的:)
    public  class Test
    {public static void main(String[] args) 
    {
    int n=Integer.parseInt(args[0]);
    int [] s=new int[n+1];
    s[0]=0;s[1]=1;s[2]=2;
    for (int i=3;i<=n;i++)
    s[i]=s[i-1]+s[i-2];
    int [][]ss=new int [s[n]+2][n+1];
    for(int i=1;i<=s[n] ;i++){
    ss[i][n]=n;}for (int j=n-1;j>0;j--){
    for(int i=1,k=j;i<=s[n] ;){
    //System.out.print(k+"           ");
    for(int m=1;k>0 && m<=s[k];m++){
    ss[i][j]=k;
    //System.out.print("ss["+i+"]["+j+"]="+ss[i][j]+" ");
    i++;
    }
    //System.out.println();
    if (k==0){i++;
    k=ss[i][j+1]-1;}
    else if ( ss[i-1][j+1]-ss[i-1][j]==2)
    {k=ss[i][j+1]-1;}
    else  k--;
    if (k<0) break;
    }
    }
    for(int i=1;i<=s[n];i++){
    for(int j=1;j<=n;j++){
    System.out.print(ss[i][j]);}
    System.out.println("");
    }
    }
    }