基本题型之栈和递归(一)

 1.栈的入栈顺序的易错点

一个栈的入栈序列是a,b,c,d,e则栈的不可能的输出序列是:()
 
A edcba         B decba           C dceab            D abcde

答案是C:d出栈了,abc一定已经入栈,那么abc只能以cba的顺序出栈。

很多人会认为答案是BCD

2.递归

所谓递归就是函数调用函数本身,一般递归都用来解决有重复子问题的问题。

(1)下面是用代码求解阶乘:n!=n\times (n-1)!

边界条件:n=1

int factorial(int n)
{
    if(n<=1) return 1;//截至条件,不然会一直递归下去
    return n*factorial(n-1);
}

(2)用递归求斐波那契数列

定义:f(n)=\left\{\begin{matrix} 1 & n=1\\ 1&n=2 \\ f(n-1)+f(n-2) & n>2 \end{matrix}\right.

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.经典题出栈次序

出栈次序 - 蓝桥云课 (lanqiao.cn)

f(1)= 1     //即 1

f(2)= 2     //即 12、21

f(3)= 5     //即 123、132、213、321、231

为了规整化,我们定义f(0) = 1;于是f(4)可以重新写为:

f(4) = f(0)*f(3) + f(1)*f(2) + f(2) * f(1)+ f(3)*f(0)

然后我们推广到n,推广思路和n=4时完全一样,于是我们可以得到:

f(n) = f(0)*f(n-1) + f(1)*f(n-2) + ... +f(n-1)*f(0)
 

一辆车:f\left ( 1 \right )=1

两辆车:f\left ( 2 \right )=2

三辆车:f(3)= f(0)*f(2) + f(1)*f(1) + f(2) * f(0)

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);
}

猜你喜欢

转载自blog.csdn.net/mabaizi/article/details/128893193