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

使用递归计算混乱?(c代码),c,recursion,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

我们一直在学习计算理论中的密码学,课堂上出现了我感兴趣的混乱概念,所以我想对这个话题做一些调查

为此,我一直在尝试开发一个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);
}
#包括
#包括
#定义集合大小4
内部主(空)
{   
int i,j,k,l,计数器=0;
对于(i=0;i
但我希望能够为设置大小输入一个值作为程序的参数,并计算该设置大小的混乱数量

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


有人有什么想法吗?

对于计算任意n个对象的去射程数,您可以使用给定的公式或。您可以使用阶乘实现来实现它。

要计算任意n个对象的去范围数,您可以使用给定的公式或。您可以使用阶乘实现来实现它。

要计算任意n个对象的去范围数,您可以使用给定的公式或。您可以使用阶乘实现来实现它。

要计算任意n个对象的去范围数,您可以使用给定的公式或。您可以通过阶乘实现来实现它。

我喜欢您的方法。您可能已经开始看到,您希望为集合的每个子集继续运行for循环,这表明它是一种类似堆栈的结构。递归的工作原理是重复地推送到调用堆栈上,所以这就像是计数方法的抽象。我建议阅读,看看下面是如何推导出来的

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));
}
无符号整数D(整数n){

if(n我喜欢你的方法。你可能开始看到你想要为集合的每个子集运行一个for循环,这意味着一个类似堆栈的结构。递归是通过反复推到调用堆栈上来工作的,所以这就像是计数方法的一个抽象。我建议你读一下,看看下面是如何推导出来的

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));
}
无符号整数D(整数n){

if(n我喜欢你的方法。你可能开始看到你想要为集合的每个子集运行一个for循环,这意味着一个类似堆栈的结构。递归是通过反复推到调用堆栈上来工作的,所以这就像是计数方法的一个抽象。我建议你读一下,看看下面是如何推导出来的

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));
}
无符号整数D(整数n){

if(n我喜欢你的方法。你可能开始看到你想要为集合的每个子集运行一个for循环,这意味着一个类似堆栈的结构。递归是通过反复推到调用堆栈上来工作的,所以这就像是计数方法的一个抽象。我建议你读一下,看看下面是如何推导出来的

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));
}
无符号整数D(整数n){

if(n)你确定你需要循环吗?我的意思是,对于任何一个有效的数字,它都会非常慢。如果你只需要一个可能的排列计数(而不是排列本身),它可以在不迭代所有可能元素的情况下完成。您确定需要循环吗?我的意思是,对于任何有效数字,它都会非常慢。如果您只需要一个可能的置换计数(而不是置换本身),它可以在不迭代所有可能元素的情况下完成。您确定需要循环吗?我的意思是,对于任何有效数字,它都会非常慢。如果您只需要一个可能的置换计数(而不是置换本身),它可以在不迭代所有可能元素的情况下完成。您确定需要循环吗?我的意思是,对于任何有效的数字,它都会非常慢。如果您只需要一个可能的置换计数(而不是置换本身),那么它可以在不迭代所有可能元素的情况下完成。