购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

例题2
排列组合

我们再来看看排列组合,它们经常作为数学类解题方法被用来破解谜题。高中数学中经常出现“从 n 个物品里取出 r 个”这类问题。这类问题可以分为考虑排列顺序的“排列”和考虑选取方法的“组合”。

排列通常写作 ,通过简单的乘法就能求解。例如 。一般来说,排列可以用下面的数学公式计算出来。

这部分按顺序相乘即可,用简单的处理逻辑就能实现(代码清单pre02.01和代码清单pre02.02)。

组合个数的计算则相对复杂一些,我们可以用多种编程方式来实现。组合通常写作 ,可以用下面的数学公式计算出来。

如果用Ruby或JavaScript通过递归处理内存化的方式来实现,则程序如代码清单pre02.03和代码清单pre02.04所示。

但是,在使用这种方法的情况下,如果 n 的值变大,分母和分子的值就会变大,在使用某些编程语言时就无法正确地进行计算。例如,在使用JavaScript的情况下,计算中途会变成对浮点型数据的计算。

因此,在编程中也经常用到下面这种递归的定义。这种方法可以使程序更加简洁,把程序的大小控制在一定范围内,所以本书中大量采用了这种定义。具体实现如pre02.05和代码清单pre02.06所示。

但这种方法也有缺陷:由于递归层级较深,所以如果 n 的值变大,就会导致栈空间不足。因此,有时也会使用下面这种递推公式来实现。当使用递推公式实现的时候,可以通过循环处理来实现,这样就不会消耗栈空间了。

如果处理会反复用到,我们还可以考虑像代码清单pre02.07和代码清单pre02.08这样让处理内存化。

读者可以从下一章开始试着用本章列举的技巧来解决实际问题。另外,本书中的源代码仅用作示例,不排除有更高效的实现方式。各位不妨开动脑筋想一想。 Esvexn7cCrDhirpAZdcpqiUk7QKL9Y+9FWHf1XGk23XrrFI0bPT7T2Umll/HqckG

点击中间区域
呼出菜单
上一章
目录
下一章
×