[ 具体数学 ] 1:递归式与封闭式

递归问题

汉诺塔(HANOI)

命题

有三根杆子,第一根有大小从小到大共个盘子,要求遵循以下3个规则,将在第一个杆子上全部的盘子移至第三个杆子。

  1. 每次只能移动一个盘子。
  2. 每次只能移动每个杆子最上面的盘子。
  3. 每根杆子上的盘子下面大,上面小。

求问题的最小步数。

例子:

当时,移动方法如下图所示。

Tower_of_Hanoi.gif

最小移动次数为,故时命题的解为。

解决

方法:命名并求解

命名

  1. 设为个盘子时汉诺塔问题的解.
  2. 三个杆子的编号分别为.
  3. 第层盘子为.

注: 书上或有的博文上用,但笔者认为用更为合适,因为问题的解更像函数.

求解

显然,

观察可得,将个盘子从移动到相当于将移动至后,将移至,再将移至.

由定义知,将从移至需步.

检验

已知






代码

# python
A = [3, 2, 1]
B = []
C = []

def move(n, source, target, auxiliary):
    if n > 0:
        # Move n - 1 disks from source to auxiliary, so they are out of the way
        move(n - 1, source, auxiliary, target)

        # Move the nth disk from source to target
        target.append(source.pop())

        # Display our progress
        print(A, B, C, '##############', sep='\n')

        # Move the n - 1 disks that we left on auxiliary onto target
        move(n - 1, auxiliary, target, source)

# Initiate call from source A to target C with auxiliary B
move(3, A, C, B)

递归式

递归是在计算过程中调用自己的求解方法。

构成递归需具备的条件

  1. 子问题须与原始问题为同样的问题,且更为简单。

  2. 不能无限制地调用本身,须有边界,化简为非递归状况处理。

汉诺塔的求解公式就是典型的递归。

封闭式

在前面的递归式中,不难看出,计算需要进行次将替换为的操作。

所以递归式虽然直观,但不方便计算。

封闭式可以直接计算出函数的值,不需要进行递归。

我们尝试将汉诺塔的递归式转换为封闭式。

法1

求解







检验

已知



法2

求解





证毕.

平面上的直线(LINE)

命题

在一个平面内,条直线最多能把平面分成多少个区域

解决

方法:命名并求解

命名

  1. 设为条直线把平面分成的最大区域数.

求解

显然,

之后每一条直线都能与之前每一条直线有一个交点.

于是能产生个新平面.

如下图

image

白线 : 原有的线

灰面 : 原有的面

红线 : 新增的线

红面,橙面 : 新增的面

综上:

转为封闭式

求解

如何将和式转为递归式呢?
见下一章:

[ 具体数学 ] 和式与封闭式

你可能感兴趣的:([ 具体数学 ] 1:递归式与封闭式)