算法题目:小白上楼梯

补充一下几种排序的复杂度:



 注:

算法的稳定性:指的不是算法的时间复杂度不稳定

如果在排序之前a在b的前面(a=b时),排序完以后,a跑到b的后面,那么称这个算法不稳定。

排序完以后,两个数的位置不交换,那么称算法稳定。


题目:小白走楼梯:小白正在上楼梯,总共有n阶楼梯,她总共可以有三种方式,一次上阶,两节楼梯,或者三阶。问:如果要走完n阶楼梯,一共有多少种走法

思路:递归的方法。 倒着来思考,假设他现在站在最顶层,他每一次只能有三种方案,

一次一阶,两阶,三阶,而这些方案加起来,等于他上的总阶数,即:

f(n)=f(n-1)+f(n-2)+f(n-3),表达式和斐波拉契数列的表达式看起来很像,思路也有些

类似,这个问题有三个分支,算法的复杂度是O(3^n)。


代码:

package LanQiaoKnowledge;

import java.util.Scanner;

public class 小白上楼梯 {

static int f(int n) {

if(n==0) {

return 1; //理论上n=0的时候,f(n)=0,但是,为了验算正确,对代码做调整,令f(0)=1;

}

if(n==1) {

return 1;

}

if(n==2) {

return 2;

}

return f(n-1)+f(n-2)+f(n-3);

}

public static void main(String[] args) {

while(true) {

Scanner in=new Scanner(System.in);

System.out.println("input n:");

int n=in.nextInt();

int a=f(n);

System.out.println("总共有"+a+"总共方案");

}

// long before=System.currentTimeMillis();

// long now=System.currentTimeMillis();

// long b=(now-before)/1000;

// System.out.println("耗时"+b+"秒");

}

}


结果:


对了,我不知到为什么我把n=0和n=1合并写的时候,代码就会出现栈溢出。

if(n==0&&n==1){

return 1;

}


这样写就不行?


你可能感兴趣的:(算法题目:小白上楼梯)