使用递归计算紊乱? (c代码)

时间:2014-03-24 06:17:41

标签: c recursion

我们一直在研究计算理论中的密码学,课堂上出现了紊乱的想法让我感兴趣,所以我想对这个主题做一些调查。

为此我一直在尝试制定一个可以计算任意设定大小的紊乱的c程序,但是遇到了一些麻烦。

我已经能够编写一些可以计算特定集合大小的紊乱的内容,例如。 4:

#include <stdio.h>
#include <stdlib.h>

#define SET_SIZE 4


int main(void)
{   
   int i, j, k, l, counter = 0;

   for (i = 0; i < SET_SIZE; i++)
   {
      for (j = 0; j < SET_SIZE; j++)
      {
         for (k = 0; k < SET_SIZE; k++)
         {
            for (l = 0; l < SET_SIZE; l++)
            {
               if (i != j && i != k && i != l && j != k && j != l && k != l)
               {
                  if (i != 0 && j != 1 && k != 2 && l != 3)
                     counter++;
               }
            }
         }
      }
   }

   printf("number of derangements for size %d: %d\n", SET_SIZE, counter);
}

但我希望能够只将set size的值作为程序的参数输入,并计算该组大小的紊乱次数。

我认为使用递归可能是一种解决问题的方法,但我真的不能考虑如何去做这件事

任何人都有任何想法吗?

2 个答案:

答案 0 :(得分:2)

用于计算任何n个对象的紊乱数量,您可以使用给定herelink的公式。你可以用阶乘实现来实现它。

答案 1 :(得分:1)

我喜欢你的方法。你可能已经开始看到你想继续为集合的每个子集运行for循环,这表明了类似堆栈的结构。递归通过反复推入调用堆栈来工作,因此这就像是计数方法的抽象。我建议阅读this以了解如何推导出以下内容。

unsigned int D(int n){
    if(n <= 1) return 0;
    else if(n == 2) return 1;
    else return (n-1)*(D(n-1) + D(n-2));
}

示例运行here