计算在没有排列的情况下以递归方式累加数字N的方式的数量

时间:2012-02-14 20:24:56

标签: c++ recursion

对于赋值,我必须编写两个带有数字N的递归函数,并返回添加到该数字的方式的数量。

第一个函数允许排列,例如:countWithPerms(3)会将1 + 22 + 1计为两个不同的解决方案,而countIgnorePerms(3)会将它们视为相同的解决方案。< / p>

我写了countIgnorePerms()方法:

int countWithPerms(int number, int amountLeft)
{

    if(amountLeft == 1)
        return 0;
    else
        amountLeft--;

    return (countWithPerms(number, amountLeft) + 1) + 
           (countWithPerms(amountLeft, amountLeft));

}//end countWithPerms()

对此方法的第一次调用将向其传递两次相同的数字,所有后续方法调用将查找(n-1)的总和数,并将其添加到N的总和中。

我无法搞清楚如何修改此方法,使其不接受任何排列。我不太确定从哪里开始。

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

一种方法是使用std::set来包含可能的解决方案,但这种方法会消耗相当多的内存。

例如,您可以创建一个包含可能解决方案[1,2]的类。
该类将包含已排序的这些值。
对这些类重载operator<

创建一个set [初始化为空]并通过reucrsion将其[通过引用]传递给它。每次找到可能的解决方案时 - 将其添加到集合中。

由于set不包含重复项,最后 - 可能性数量为set.size()

答案 1 :(得分:0)

假设您以非降序创建了列表(以允许重复);那么你就可以为每个可能形成解决方案的整数集合提供一个独特的解决方案。

因此,对于你的N = 3例子,你将产生1 + 1 + 1和1 + 2和3作为唯一的解决方案。