标题:请帮我看下这个走楼梯的程序
只看楼主
gdy
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2010-4-5
结帖率:50%
已结贴  问题点数:10 回复次数:5 
请帮我看下这个走楼梯的程序
import java.util.*;
public class Go {
 public static int i = 0;
 public static void main(String[] args)
 {
     Scanner reader=new Scanner(System.in);
     System.out.print("请输入楼梯的数:");
     int n=0;
     n=reader.nextInt();     
  calc("", n);
  System.out.println("总共有"+i+"种走法~");
 }
 
 //上楼梯每次只需一步或者两步,有多少走法
 public static void calc(String log, int num){
  if (num == 0)
  {
   i++;
   System.out.println(log.substring(0,log.length()-1));
   return;
  }
  else if(num == 1)
  {
   i++;
   System.out.println(log+"1");
   return;
  }
  calc(log+"1,", num - 1);
  calc(log+"2,", num - 2);
 }
}
我想知道这个程序的算法过程,怎么输出的。
搜索更多相关主题的帖子: 楼梯 
2010-10-11 23:16
gdy
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2010-4-5
得分:0 
请求指教。public static void calc(String log, int num){
  if (num == 0)
  {
   i++;
   System.out.println(log.substring(0,log.length()-1));
   return;
  }
  else if(num == 1)
  {
   i++;
   System.out.println(log+"1");
   return;
  }
  calc(log+"1,", num - 1);
  calc(log+"2,", num - 2);
}
}
这里是怎么算的。看不懂这个算法
2010-10-11 23:18
syg5434
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:山沟沟
等 级:版主
威 望:10
帖 子:285
专家分:781
注 册:2010-2-28
得分:10 
程序代码:
public static void calc(String log, int num) {
        if (num == 0) {
            i++;
            System.out.println(log.substring(0, log.length() - 1));
            return;
        } else if (num == 1) {
            i++;
            System.out.println(log + "1");
            return;
        }
        //以下是该方法的两次自我调用
        System.out.println("======================" + num);
        calc(log + "1,", num - 1);
        System.out.println("----------------------" + num);
        calc(log + "2,", num - 2);
    }
   利用的是方法的自我调用,第一次调用是走一步,第二次调用是走两步,
从运行结果也可以看出来,心里明白,说不清楚。。。

不要迷恋哥,嫂子会揍你。阿-弥-陀-佛--!
2010-10-12 10:12
gdy
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2010-4-5
得分:0 
想知道  3到2 后面怎么又从2到3呢?怎么自加的呢?
2010-10-12 15:06
syg5434
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:山沟沟
等 级:版主
威 望:10
帖 子:285
专家分:781
注 册:2010-2-28
得分:0 
你再看一下下面的代码
程序代码:
package test;

import java.util.*;

public class Go {
    public static int i = 0;

    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        System.out.print("请输入楼梯的数:");
        int n = 0;
        n = reader.nextInt();
        calc("", n);
        System.out.println("总共有" + i + "种走法~");
        System.out.println(n+"说:你看,我没有变化!");
    }

    // 上楼梯每次只需一步或者两步,有多少走法
    public static void calc(String log, int num) {
        if (num == 0) {
            i++;
            System.out.println(log.substring(0, log.length() - 1));
            return;
        } else if (num == 1) {
            i++;
            System.out.println(log + "1");
            return;
        }
        System.out.println(log+"======================" + num);
        calc(log + "1,", num - 1);
        System.out.println(log+"----------------------" + num);
        calc(log + "2,", num - 2);
    }
}
,注意log的变化和num的变化,慢慢理解方法自我调用的过程,
if分支里面是直接打印的log,但是并没有改变log,num也是这样,回调的时候传进去的参数(num-1)是在变小,但是num本身没有变
你好好看下打印结果,多试几个数,3,6,这样能看出规律
很不好解释啊。。。你去看下递归思想,方法回调,这玩意儿不好说。。。



[ 本帖最后由 syg5434 于 2010-10-12 16:25 编辑 ]

不要迷恋哥,嫂子会揍你。阿-弥-陀-佛--!
2010-10-12 16:23
gdy
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2010-4-5
得分:0 
谢谢!
2010-10-14 20:07



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-322601-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.695382 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved