n个不同元素进栈,求出栈元素不同排列的个数?

假设f(n)f(n)f(n)为nnn个不同元素进栈,出栈元素不同排列的个数。定义f(0)=1f(0)=1f(0)=1
那f(1)f(1)f(1)表示只有111个元素进栈,假设元素时aaa,那么出栈元素的顺序只能是(a)(a)(a)
所以f(1)=1f(1)=1f(1)=1
当n=2n=2n=2时,假设元素为a,ba,ba,b,那么出栈元素的顺序为(ab),(ba)(ab),(ba)(ab),(ba)两种
所以f(2)=2f(2)=2f(2)=2

当n=3n=3n=3时,假设元素为a,b,ca,b,ca,b,c。
①当aaa元素为排列中第一个元素时,因为aaa是第一个入栈的,所以肯定是入栈后马上出栈,此时栈为空了,还剩b,cb,cb,c两个元素所以排列的个数为f(2)f(2)f(2)
②当aaa元素为排列中第二个元素时,我们无视aaa元素,把aaa元素当做不存在,因为aaa是第一个入栈的,那么在aaa入栈和出栈之间正好是一个完整的栈操作(即由一开始的空栈经过一系列入栈出栈操作后成为空栈),我们把排列分成两段aaa出栈前和aaa出栈后,那么aaa出栈前的排列个数为f(1)f(1)f(1),aaa出栈后又是一个完整的入栈操作,排列个数为f(1)f(1)f(1),所以总的个数为f(1)×f(1)f(1) \times f(1)f(1)×f(1)
③当aaa元素为排列中第三个元素时,那么aaa入栈出栈之间排列个数为f(2)f(2)f(2),因为总共只有三个操作,aaa出栈即结束
那么f(3)=f(2)+f(1)×f(1)+f(2)=5f(3)=f(2)+f(1) \times f(1)+f(2)=5f(3)=f(2)+f(1)×f(1)+f(2)=5

当n=4n=4n=4时我们模仿上述操作得出
f(4)=f(3)+f(2)×f(1)+f(1)×f(2)+f(3)=14f(4)=f(3)+f(2) \times f(1) +f(1) \times f(2) +f(3) =14f(4)=f(3)+f(2)×f(1)+f(1)×f(2)+f(3)=14
是不是发现了一些规律,我们把他配的整齐一点
f(4)=f(0)×f(3)+f(2)×f(1)+f(1)×f(2)+f(3)×f(0)f(4)=f(0) \times f(3)+f(2) \times f(1) +f(1) \times f(2) +f(3) \times f(0)f(4)=f(0)×f(3)+f(2)×f(1)+f(1)×f(2)+f(3)×f(0)

我们推广到nnn
f(n)=f(0)×f(n−1)+f(1)×f(n−2)+...+f(n−1)×f(0)f(n)=f(0) \times f(n-1) +f(1) \times f(n-2) + ... +f(n-1) \times f(0)f(n)=f(0)×f(n−1)+f(1)×f(n−2)+...+f(n−1)×f(0)
所以f(n)f(n)f(n)即为卡特兰数,根据卡特兰数的性质可推导出
f(n)=1n+1C2nn\mathrm{f}(\mathrm{n})=\frac{1}{\mathrm{n}+1} C_{2 n}^{n} f(n)=n+11​C2nn​
具体过程可以参考这篇博文【知识总结】卡特兰数 (Catalan Number) 公式的推导

n个不同元素进栈,求出栈元素不同排列的个数相关推荐

  1. java二维数组周边元素_求出二维数组主对角线、次对角线以及周边元素之和

    某个同学的题目,写了一下. 题目大概是这样的: 编写函数,求出二维数组主对角线.次对角线以及周边元素之和. 要求:二维数组的行数.列数.数组元素在main函数中由键盘输入. #include int ...

  2. 利用包含排斥原理求出给定范围内素数个数的问题

    一.前提 今天上离散数学课上看到一个题目:使用包含排斥原理求不超过120的素数个数,其实按照一般算法是这样的: count = 0 l = [] for x in range(121):#判断如果x是 ...

  3. 用Python求出:1到某个数的奇数序列里一共出现了多少个3

    从1开始到微信ID的数字中(),奇数序列里一共出现了多少个3. 这次练习附加题. 方法一: import time start = time.clock() inum = 866278171 sum ...

  4. Java:求出1~999999之间的所有“水仙花数”并输出

    import java.util.Scanner;public class TestDemo{public static void findNum(int n){for (int i = 1; i & ...

  5. findChessboardCorners求出的Corners按确定顺序排列

    目的: 在做平面机械臂(三轴台.SCARA)的手眼标定时,尝试使用棋盘格标定板来实现九点标定,要求每次求出的Corners都按相同的排列顺序,但是bool cv::findChessboardCorn ...

  6. 数据结构栈的操作,初始化栈,进栈,出栈,读取栈顶元素;

    代码段: #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h ...

  7. Java黑皮书课后题第7章:7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标。编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则最小

    7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标.编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则返回最小的下标) 题目 题目描述 ...

  8. Java黑皮书课后题第7章:7.9(找出最小元素)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素。编写测试程序,提示用户输入10个数字,调用这个方法返回最小值,并显示这个最小值

    7.9(找出最小元素)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素.编写测试程序,提示用户输入10个数字,调用这个方法返回最小值,并显示这个最小值 题目 题目描述与运行示例 破题 代码 ...

  9. C语言试题二十三之编写一个函数void function(int tt[m][n],int pp[n]),tt指向一个m行n列的二维函数组,求出二维函数组每列中最小元素,并依次放入pp所指定一维数组中

    1. 题目 请编写一个函数void function(int tt[m][n],int pp[n]),tt指向一个m行n列的二维函数组,求出二维函数组每列中最小元素,并依次放入pp所指定一维数组中.二 ...

最新文章

  1. python在财务上的应用-利用python实现周期财务统计可视化
  2. 为了可持续的测试自动化,透过表面看本质(译)
  3. http://blog.sina.com.cn/s/blog_458f3c010100n4st.html
  4. php jquery grid,jQuery Grid
  5. Mysql中常用的函数汇总
  6. (王道408考研操作系统)第二章进程管理-第三节8:经典同步问题之吸烟者问题
  7. linux 监控键盘,如何在Linux中使用“LogKeys”监视键盘敲键
  8. 【Flink】Flink 与数据库的集成最佳实践 【视频笔记】
  9. svn:Cannot negotiate authentication mechanism
  10. Eclipse常用开发插件(转)
  11. matlab软件进行仿真验证,matlab仿真软件
  12. Python:由于目标计算机积极拒绝,无法连接
  13. Python:实现currency converter货币换算算法(附完整源码)
  14. 做程序员久了,你会不会感觉的空虚与迷茫?其实主要原因是这几点!
  15. pwnable-passcode
  16. excel切片器_excel:在透视表中使用切片器高效筛选,升职加薪系列
  17. HYSBZ 1588 营业额统计 伸展树
  18. WXpython下载很慢安装包教程,直接安装不上,只好把所有包下载下来
  19. JavaWeb 页面跳转方式连接数据库
  20. Excel学习日记:L1-excel入门

热门文章

  1. 金蝶K3案例教程销售管理前台操作
  2. Direct2D教程(一)
  3. 【RESTful】REST 与 RESTful 理解与实践
  4. css中100vh 加减运算
  5. 压测报502 badgateway问题解决
  6. 千克 磅 磅 千克 的转换
  7. 7-4 sdut-C语言实验-分割整数
  8. matlab 数组扩充
  9. Android自定义View实现三角到八角的属性分布图-雷达图(蜘蛛网图)
  10. linux中./和sh的区别