【问题标题】:Recursive solution for Permutations排列的递归解决方案
【发布时间】:2014-02-18 09:10:55
【问题描述】:

嘿,我有一个问题,我需要创建两个函数,countWithPerms() 和 ignorePerms() 这两个函数必须是递归解决方案。 countWithPerms() 将计算实际排列的数量,而 ignorePerms() 将只计算重复排列的数量。

所以一个例子是找到数字 3 的排列。所以如果我将 3 传递给函数 countWithPerms() 会发现 3 = (2 + 1) = (1 + 2) = (1 + 1 + 1 ),所以 countWithPerms(3) 为 3,因为它计算了 3 种方式来求和 3。而 countIgnorePerms(3) 为 2,因为 (1 + 2) 和 (2 + 1),都不会计入 countWithPerms,因为它们是刚才写的顺序相反。

一个很大的例子是 countWithPerms(7) 是 63,而 countIgnorePerms(7) 是 14。

我已经完成了 countwithPerms,但我完全卡在 countIgnorePerms 上。

 int countWithPerms( int n)
 {
     if(n == 1)
           return 0;
     else
           n--;
     return (countWithPerms(n) + 1) + 
            (countWithPerms(n));
}

    int ignorePerms(int sum, int xmin){
    if(sum == 1)
           return 0;

        else
        for(int i=0; i<sum;i++){
            sum += sum-xmin;
            2*ignorePerms(sum,xmin)+1;

                 return sum;
    }
}

【问题讨论】:

  • 您计算的是分区,而不是排列。
  • ignorePerms() 被称为integer partition,countWithPerms() 被称为composition of integer
  • 我认为你是在排列的地方计算操作。
  • 假设您的函数是正确的,您确实应该将 return 语句简化为 2*countWithPerms(n)+1 - 您目前使用的是指数算法而不是线性算法。
  • @Dukeling:实际上对于“带有排列”的版本,答案是一个微不足道的封闭形式(只需考虑 n 1 并计算您可以在 @987654326 中放置“障碍”的不同方式@一个数字和下一个数字之间的位置)...

标签: c++ algorithm recursion


【解决方案1】:

不考虑排列而计数的想法是只考虑有序的解决方案。

除了n 之外,要进行此传递,附录必须具有的最小值xmin 是多少。例如

3 = 1 + 2

没问题(因为 2 >= 1),但是

3 = 2 + 1

不可接受(因为 1

所以想法是写一个函数来回答“有多少非递减项的和可以给出第一个附录中规定的total不小于min_addendum?”。

  1. 如果min_addendum 大于total 显然答案是0
  2. 如果 total 是 1,那么只有一个和
  3. 否则第一个可能的总和是total,那么你应该算作总和
    • min_addendum + 其他不减项之和,第一项不少于min_addendum 合计total-min_addendum
    • min_addendum+1 + 其他不减项之和,第一项不少于min_addendum+1 合计total-min_addendum-1
    • min_addendum+2 + 其他不减项之和,第一项不少于min_addendum+2 合计total-min_addendum-2
    • ...

【讨论】:

  • xmin 需要设置为什么? n-1?
  • 最初你将它作为 0 传递(因为你可以接受任何附录作为第一个)并且在递归调用中你需要传递你刚刚添加的值(以确保序列是有序的)。跨度>
  • 嗯,我还是有点困惑,所以我在 n 被 evaulted 之后传入,但是函数知道 n 的程度必须是
  • @AaronB:我写了一个可能解决方案的草图。然而,在提议的草图中,xmin 的初始值是 1,而不是 0。不仅仅是 C 代码......你不希望这样,对吗? :-)
  • 大坝我什至不觉得我很亲密...发布了我到目前为止在编辑中的内容
猜你喜欢
  • 1970-01-01
  • 2013-07-22
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 2018-12-30
  • 2018-11-30
  • 2020-06-07
相关资源
最近更新 更多