爬楼梯算法问题分析(不止三步)

算法分析:

  1. 阶梯数为1,爬楼梯方法就一种,为1,f(1)=1;
  2. 阶梯数大于1的时候,递归求解:阶梯数为2的时候,最多两种方式上楼:1 ,1;2  =>  f(2)=2;
  3. 爬三层楼梯的时候,爬1层,再爬两层,则是爬三层楼梯由爬一层楼梯和爬两层楼梯的情况的结合:f(3)=f(2)+f(1);
  4. 以此类推:f(n) = f(n-1)+f(n-2)+...+f(n-n+1)   =>   f(n)=f(n-1)+f(n-2)+...+f(1);此种情况,设置的最大爬阶梯数为n-1;
  5. 当限定最大爬阶梯数量为m时候(0 ≤ m ≤ n-1) 那么,f(n)=f(n-1)+f(n-2)+...+f(n-m)。

 /**
  * 
  */
package com.cn.count;


import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Scanner;


import javax.swing.JFrame;


/**
 * 
 * 算法-爬楼梯问题
 * 
 * @author ymf
 * 
 */
public class Count extends JFrame{

	/**
	 * main方法
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		Count cout = new Count();
		cout.setVisible(true);
		
		// 输入阶梯数
		System.out.print("请输入阶梯最大数量:");
		Scanner s = new Scanner(System.in);
		final int total = s.nextInt();
		System.out.println("注:输入的爬接替数最大为阶梯数-1");
		// 输入爬楼梯数
		System.out.print("请输入最大的爬阶梯数:");
		Scanner s1 = new Scanner(System.in);
		final int max = s1.nextInt();

		// 判断爬阶梯数是否小于阶梯数
		if (total <= max) {
			System.out.println("输入的爬阶梯数过大!");
			return;
		}

		// 输出爬楼梯情况
		StringBuffer str = new StringBuffer("---->\t");
		System.out.println(total + "阶楼梯的爬法总共为:\t"
				+ getMethodCount(total, max, str));
	}

	/*
	 * 爬楼梯情况统计
	 */
	public static int getMethodCount(int total, int max, StringBuffer str) {
		if (0 == total) {
			// 阶梯数为0
			System.out.println(str);
			return 1;
		} else if (1 == total) {
			// 阶梯数为1,爬楼梯方法就一种,为1,f(1)=1
			System.out.println(str.append("1"));
			return 1;
		} else {	
			// 用于统计爬楼梯的方法总数
			int result = 0;
			for (int i = 1; i <= total; i++) {
				// 存入输出情况的标题头
				StringBuffer strBuffD = new StringBuffer(str);


				if (i <= max) {
					result += getMethodCount(total - i, max,
							strBuffD.append(i + "\t"));
				}
			}
			return result;
		}
	}
	
}


你可能感兴趣的:(爬楼梯算法问题分析(不止三步))