这周接触了离散数学的第一章,也就是基础章节,主要是集合论、递推式、组合排列数方面的基础知识。这里含有关于递推式的一道题目。

最本来的解法是采用了递推式进行求解,但是我想到了一种组合排列数的解法。

一、原始题目:

使用多米诺骨牌,即1x2的小方格,覆盖2 x n的方格棋盘,有多少种不同的方式?

二、递推关系进行求解:

从题目而言,我们发现的递推关系是:当为n时,只考虑最右边的竖着的两个方格,如果用一个竖立的多米诺骨牌进行填充,那么此时的填充方式跟n-1时的一致,如图a所示;而如果用两个横着的多米诺骨牌填充,那么此时的填充方式数目跟n-2时的一致,如图b所示。

图a

图b

因此我们可以得到这样的递推式子,即f(n)=f(n-1)+f(n-2),也就是2-阶常系数齐次递推关系式,更准确些,该式就是斐波那契数列,但是初值时f(1)=1,f(2)=2。

我们采用2-阶常系数齐次递推关系式的通用解法,如下如所示:

图c. 2-阶常系数齐次递推关系式的通用解法

三、组合排列数解法

组合排列数解法,其中心思想就是可重排组合数,以及本题目的一个重要特性:填充的多米诺骨牌中,横着的个数一定是2的倍数,即如图所d所示。因为图e所示的情况不会出现,出现的话,将导致无法填充满这个2 x n的区域。

图d

图e,无法完全填充的情况

因此,我们可以如此进行数学说明:假设竖着排列的骨牌个数为a,横着排列的骨牌个数为b,那么如果填充满整个区域,则存在着这样的关系式a+2*(b/2)=n,即a+b=n,从容斥定理来看,这也是必然的。

因此,如果a,b确定后,问题就变成了a个竖立的和b/2个横着的骨牌如何排列组合的问题,相当与把b/2个相同的苹果,放入(a+1)个不同的盒子的问题,即是可重排组合数,其组合数为C(a+1+b/2-1,b/2)=C(a+b/2, b/2)=C(n-b/2, b/2)。

如此,我们就知道了当a,b确定后,此时的情况个数为多少了。

而另一方面,我们知道,对于任何一个n,b的情况为1+(n//2)种 ,那么我们可以得到f(n)如下所示:

四、验证

看起来上述的两种方法得到了完全不同的结果,但是实际上两者是完全一致的。利用两种不同的解法,我通过python验证了两者的结果,我的验证结果如下所示,combine是采用第二种解法得到的曲线,facb是采用斐波那契数列的结果,x轴表示n,y轴表示2 x n时的有多少种填充方式:

五、python代码如下所示:

import math
import numpy as np
import matplotlib.pyplot as plt
# 通过斐波那契数列进行计算
def facb(n):if n == 1:return 1elif n == 2:return 2n -= 1a0 = (3*math.sqrt(5)+5)/10b0 = (3*math.sqrt(5)-5)/10a = (1+math.sqrt(5))/2b = (1-math.sqrt(5))/2return a0*math.pow(a,n)+b0*math.pow(b,n)# 阶乘函数
def factorial(num):# 查看数字是负数,0 或 正数if num < 0:print("抱歉,负数没有阶乘")return Noneelif num == 0:print("0 的阶乘为 1")return 1else:factorial = 1for i in range(1, num + 1):factorial = factorial * iprint("%d 的阶乘为 %d" % (num, factorial))return factorial# 以下是自己通过组合数进行得到的结果
def comb(n):b = [i//2 for i in range(n+1) if i%2==0]res = 0for i in b:m = n - ires += factorial(m)/(factorial(m-i)*factorial(i))return resdef test_two(n):x = np.arange(1, n + 1)yc = []yf = []for i in x:yc.append(comb(i))yf.append(facb(i))yc = np.array(yc)yf = np.array(yf)plt.xlabel('n')plt.ylabel('number')plt.plot(x, yc, "x-", label='combine')plt.plot(x, yf, "+", label='facb')for xy in zip(x, yc):plt.annotate(str(int(xy[1])), xy=xy)plt.grid()plt.legend()plt.savefig("两者的结果.jpg")plt.show()if __name__ == '__main__':test_two(10)

离散数学-趣味题之一相关推荐

  1. 从CSDN的趣味题学PYTHON

    2019独角兽企业重金招聘Python工程师标准>>> 转自:http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.htm ...

  2. java趣味题-打印杨辉三角

    java趣味题-打印杨辉三角 public class First105 { public static void main(String[] args) {   int [][] a=new int ...

  3. 一道有趣的啤酒趣味题

    一道有趣的啤酒趣味题 试题 10元钱 2元钱,买1瓶啤酒 2个空瓶,换1瓶啤酒 4个瓶盖,换1瓶啤酒 第一步: 10元,先买了5瓶 第二步: 得到 5个空瓶: 5个瓶盖: 4个空瓶,可以换2瓶: 剩下 ...

  4. JAVA趣味题(答案下页慢慢答)

    Java趣味题 1.有50层的楼往下扔小球,已知小球某一层坠落会碎,请问你需要多少次可以找到该层楼,用java代码实现该楼层 2.给你一组字符串,如:dAiEq145ewo2Qp4,轻你编写输出里面的 ...

  5. Hankson趣味题

    1.基本要求 求N个数的最大公约数和最小公倍数 1.1算法思路 先求出两个数的最大公约数(最小公倍数),然后将他们的最大公约数(最小公倍数)与第三个数求最大公约数(最小公倍数),由此递推求多个数的最大 ...

  6. Hankson的趣味题

    Hankson的趣味题 时间限制: 1 Sec  内存限制: 128 MB [提交][状态][讨论版] 题目描述 已知正整数a0,a1,b0,b1.设某未知正整数x 满足: 1. x 和a0 的最大公 ...

  7. python趣味题_从CSDN的趣味题学PYTHON

    转自:http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html 本文给出两道趣味题的Python解法 题目1:要求算一任意长度字符串中 ...

  8. 约数——Hankson的趣味题

    Hankson的趣味题 Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫Hankson. 现在,刚刚放学回家的Hankson正在思考一个有趣的问题. 今天在课堂上,老师讲 ...

  9. java蓝桥杯练习 Hankson的趣味题

    java蓝桥杯练习 Hankson的趣味题 资源限制 时间限制:1.0s 内存限制:64.0MB 问题描述 Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hank ...

最新文章

  1. linux启动服务器ftp监听,Linux redhat6.5开启ftp服务
  2. Spring Boot与日志 ——日志框架、日志配置||SLF4j使用||SpringBoot日志关系||切换日志框架
  3. Spring Boot集成CKFinder
  4. P3178 [HAOI2015]树上操作
  5. 29/07/2010 sunrise
  6. 可访问性不一致的原因与解决方法
  7. 云原生数据仓库TPC-H第一背后的Laser引擎大揭秘
  8. JavaScript函数重载模拟
  9. 简短介绍_简短的自我介绍
  10. MVC源码分析 - 路由匹配
  11. 【React】设计高质量的React组件
  12. JavaScript通过style只能获取内联 状态的样式
  13. rest接口webservice接口利用http请求方式发送数据
  14. Excel.cpp和Excel.h的获取
  15. 查看本机MAC地址的方法
  16. Linux命令:readelf
  17. 概率论02-概率,古典概型
  18. 通过豆瓣API爬取北美票房榜
  19. springboot校园二手交易市场网站毕业设计-附源码071008
  20. 做废20个账号才总结出的短视频运营干货

热门文章

  1. 高德地图API简单使用——地名转经纬度
  2. Cross-category Video Highlight Detection via Set-based Learning
  3. 公司到底是怎么看我们的…… 1
  4. 请求分页置换算法——先进先出算法(FIFO)
  5. 服务器系统通用串行总线控制器,通用串行总线控制器出现叹号是什么情况?怎么解决?...
  6. 数值计算方法——乘幂法和反乘幂法
  7. 植物大战僵尸一:多线程修改UI界面,游戏必备API
  8. openCV、C++处理影像的五种方法(Wallis、直方图、xy拉伸、翻转、旋转)
  9. 01:入门篇 - 初识 CTK
  10. Verilog语言入门学习(3)