今天看到ClimbingStairs这道题目,发现有多种解法,自己顺便整理了一下。主要的解题方法有三种,其中最重要的是如何将该问题和斐波那契数列进行关联起来:
1)递归实现;思路最简单,但n较大时,存储空间变大,且速度变慢。
2)迭代实现;类似方法1)。
3)采用斐波那契数列的通项公式实现。
这里主要是给出斐波那契数列的通项公式的推导过程。先给出代码,后给出推导过程,如下:
package LeetCode_chz;
import java.util.Scanner;
/**
* @题目描述:You are climbing a stair case. It takes n steps to reach to the top.
* Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
* Note: Given n will be a positive integer.
* @author 崔洪振367
* @version 创建时间:2017年4月24日 下午4:40:39
*
* 思路:这是一个爬n阶台阶的问题,每次只能攀爬1个或2个台阶。
* f(n)=f(n-1)+f(n-2)
*/
public class Q070_ClimbingStairs {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int result = climbStairs1(n);
System.out.println(result);
int result2 = climbStairs2(n);
System.out.println(result2);
int result3 = climbStairs3(n);
System.out.println(result3);
}
/**
* 递归实现
* @param n
* @return
*/
public static int climbStairs1(int n){
if(n==1){
return 1;
}else if(n==2){
return 2;
}
return climbStairs1(n-1) + climbStairs1(n-2);
}
/**
* 迭代实现
* 该题本质上是斐波那契数列数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
* 且:a1=0,a2=1,an=a(n-1)+a(n-2)(n>=2,n∈N*)即:裴波那契数列的第n项的值是第n阶楼梯的爬法的种类数
*
* @param n
* @return
*/
public static int climbStairs2(int n){
int a=0;//
int b=1;
for(int i=1; i<=n; i++){//台阶计数从1开始,一共n个
int temp = b;//记录一下当前的值
b += a;//更新当前的值
a = temp;//更新前一个值
}
return b;//返回当前的值
}
/**
* 采用斐波那契数列的数学公式
* @param n
* @return
*/
public static int climbStairs3(int n){
double d = Math.sqrt(5.0);
double a = (1+d)/2;
double b = (1-d)/2;
double aa = Math.pow(a, n+1);
double bb = Math.pow(b, n+1);
double c = (aa-bb)/d;
return (int)c;
}
}
推导过程如下: