很难的递归问题,思索半天不得其路,望高手相助
令c(n)是从1到n-1的n个整数中选择的不同整数组的数目,各组中的整数加起来等于n(例如,4=1+1+1+1=1+1+2=2+2……)。编写在如下情况下求c(n)的递归函数:
(1)对置换计数,例如,1,2,1和1,1,2是和为4的两组;
(2)忽略置换。
求思路,代码也不拒绝,最好用C/C++描述。
[解决办法]
首先f(1)=[1]
然后考虑f(n)和f(n-1)的关系。
f(n)=[f(n-1)+1,[f(n-1),1]]
递归
f(2)=[[2], [1,1]]
f(3)=[[3],[2,1],[1,2], [2,1],[1,1,1]]
不知道你看懂这个意思没。剩下的合并同类项啥的就行了。
[解决办法]
c(1)=[1]
c(2)=[2],[1,1]
c(3)=[3],[1,2],[2,1],[1,1,1]
c(4)=[4],[1,3],[2,2],[3,1],[1,2,1],[1,1,2],[2,1,1],[1,1,1,1]
c(5)=[5],[1,4],[2,3],[3,2],[1,2,2],[1,1,3],[2,1,2],[1,1,1,2],
[4,1],[1,3,1],[2,2,1],[3,1,1],[1,2,1,1],[1,1,2,1],[2,1,1,1],[1,1,1,1,1]
由此可见f(n)=[f(n-1)+1,[f(n-1),1]]是正确的,
只不过f(n-1)+1只取数组最后一位+1就行了,
比如
c(4)+1=[4+1],[1,3+1],[2,2+1],[3,1+1],[1,2,1+1],[1,1,2+1],[2,1,1+1],[1,1,1,1+1]
=[5],[1,4],[2,3],[3,2],[1,2,2],[1,1,3],[2,1,2],[1,1,1,2]
[c(4),1]=[4,1],[1,3,1],[2,2,1],[3,1,1],[1,2,1,1],[1,1,2,1],[2,1,1,1],[1,1,1,1,1]
c(5)=c(4)+1,[c(4),1]