集合的划分 #
- 集合划分递归函数的定义
- 斐波那契数列递归的拆解
- 递归的出口
集合的划分的介绍 #
在数学中,集合S的划分是把S分割到覆盖了S的全部元素的不交叠的“部分”或“块”或“单元”中。例如:将集合S={1,2,3}的3个元素,划分成2个集合则有以下划法:
def f(n,k):#f(n)函数功能:返回划分集合的方法数,参数为n为集合元素的总个数,k为划分为几个集合 pass
递归的拆解 #
递归问题的拆解是递归最核心的部分,针对集合的划分,考虑一般情况,对于集合S中任意一个元素i,在划分k个子集时分为两种情况:
则综合1,2两种情况,我们就得到了递归函数的数学表达式,f(n,k)=k*f(n-1,k)+f(n-1,k-1)
def f(n,k): s= k*f(n-1,k)+f(n-1,k-1)#递归函数地拆解 return s
递归的出口 #
在考虑一般情况将递归问题拆解后,考虑递归的边界情况。
因此上述的边界条件可总结如下:
def f(n,k): if(n<k or k==0):#满足边界条件,递归的出口 return 0 if(k==1 or k==n):#递归出口 return 1 s= k*f(n-1,k)+f(n-1,k-1)#递归的拆解 return s
小结 #
习题 #
- 画出上例中f(4,3)递归调用执行过程图
- 上述递归算法的第一个边界条件从递归调用来看似乎是多余的,能去掉吗?如果去掉后使用递归函数f(n,k)时应该注意什么问题