1.栈的入栈顺序的易错点
一个栈的入栈序列是a,b,c,d,e则栈的不可能的输出序列是:()
A edcba B decba C dceab D abcde
答案是C:d出栈了,abc一定已经入栈,那么abc只能以cba的顺序出栈。
很多人会认为答案是BCD
2.递归
所谓递归就是函数调用函数本身,一般递归都用来解决有重复子问题的问题。
(1)下面是用代码求解阶乘:
边界条件:
int factorial(int n)
{
if(n<=1) return 1;//截至条件,不然会一直递归下去
return n*factorial(n-1);
}
(2)用递归求斐波那契数列
定义:
int fibonacci(int n)
{
if(n==1||n==2) return 1;
return fibonacci(n-1)+fibonacci(n-2);
}
就是用递归的方法复杂度较高,建议可以用动态规划:
int fibonacci(int n)
{
if(n < 1) return -1;
vector<int> F;
F[1] = 1;
F[2] = 1;
for(int i = 3; i <= n; i++)
{
F[i] = F[i-1] + F[i-2];
}
return F[n];
}
3.经典题出栈次序
f(1)= 1 //即 1
f(2)= 2 //即 12、21
f(3)= 5 //即 123、132、213、321、231
为了规整化,我们定义f(0) = 1;于是f(4)可以重新写为:
然后我们推广到n,推广思路和n=4时完全一样,于是我们可以得到:
一辆车:
两辆车:
三辆车:
int fun(int a, int b) // a是等待进站的数目,b是站中的数目
{
if (a == 0)// 此时已全部进站,出站时的顺序只有一种
return 1;
if (b == 0)// 此时车站为空,只能让车进站
return fun(a - 1, 1);
// 有两种走法:1、让一辆车进站 ;2、让一辆车出站
return fun(a - 1, b + 1) + fun(a, b - 1);
}
int fun(int a) //a=16
{
return fun(a, 0);
}