【发布时间】:2015-05-07 15:02:21
【问题描述】:
我正在尝试编写一个递归函数(它必须是递归的)来打印出 1 到 n-1 的分区和分区数。 例如,4 个组合的总和为 4:
1 1 1 1
1 1 2
1 3
2 2
我只是在这个功能上遇到了很多麻烦。下面这个功能不起作用。有人可以帮帮我吗?
int partition(int n, int max)
{
if(n==1||max==1)
return(1);
int counter = 0;
if(n<=max)
counter=1;
for(int i = 0; n>i; i++){
n=n-1;
cout << n << "+"<< i <<"\n";
counter++;
partition(n,i);
}
return(counter);
}
【问题讨论】:
-
“下面的这个函数不起作用” - 它有什么作用? 提供样本输入会输出什么?您是否了解为什么它会这样做或有任何怀疑为什么它似乎不起作用?
-
最大值为 n-1。输出它: 请输入数字:4 3+0 2+0 1+0 1+1 2+1 计数器:2 @WhozCraig
-
因此,给定一个数字 N,您希望找到所有 唯一 个自然数集,每个自然数集在 [1, N) 范围内,以递归方式总和为 N ?
-
是,但在 1 到 n-1 的范围内
-
@CSCI_newbie 我想出了一个解决方案。这一切都不是那么容易。这里有一些提示:让你的递归函数获取 N、当前总和、当前的被加数数组和被加数的数量。递归的基本情况是当 sum == N 时。在这种情况下,只需打印数组并返回。看看你是否能找出递归的情况。首先递归地打印出总和的所有排列,然后找出如何将其减少到只有唯一的和数集,可能会更容易。