Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C编程-两个用于递归的循环_C_Recursion - Fatal编程技术网

C编程-两个用于递归的循环

C编程-两个用于递归的循环,c,recursion,C,Recursion,我试着做一个递归函数来模拟两个for循环。因此,函数必须执行以下操作: int recursion(int n, int i, int j) { for(i=0; i<n; i++) { for(j=i+1; j<n; j++) { printf("%d %d\n", i, j); } } } 但这两个版本的函数的输出不同。有谁能告诉我我把递归函数错在哪里了吗?我不确定你能否用一个递归函

我试着做一个递归函数来模拟两个for循环。因此,函数必须执行以下操作:

int recursion(int n, int i, int j)
{
    for(i=0; i<n; i++)
    {
        for(j=i+1; j<n; j++)
        {
            printf("%d %d\n", i, j);
        }
    }
}

但这两个版本的函数的输出不同。有谁能告诉我我把递归函数错在哪里了吗?

我不确定你能否用一个递归函数替换两个
for
循环。您可以轻松地使用两个递归函数使其工作

void recursion2(int n1, int n2)
{
   if ( n2 >= 0 )
   {
      recursion2(n1, n2-1);
      // Do whatever you need to do with the variables.
      func(n1, n2);
   }
}

void recursion1(int n1, int n2)
{
   if ( n1 >= 0 )
   {
      recursion1(n1-1, n2);
      recursion2(n1, n2);
   }
}

我不确定是否可以用一个递归函数替换两个
for
循环。您可以轻松地使用两个递归函数使其工作

void recursion2(int n1, int n2)
{
   if ( n2 >= 0 )
   {
      recursion2(n1, n2-1);
      // Do whatever you need to do with the variables.
      func(n1, n2);
   }
}

void recursion1(int n1, int n2)
{
   if ( n1 >= 0 )
   {
      recursion1(n1-1, n2);
      recursion2(n1, n2);
   }
}

两个
for
循环的递归可以通过以下方式完成:

void recursion(int n,int i,int j) //void since you return no value
{
    if(i<n)
    {
        if(j<n)
        {
            printf("%d %d\n",i,j);
            recursion(n,i,++j); //never use post increment
        }
            else
            recursion(n,++i,0);
    }
}
样本输出:

1 1
1 2
1 3
1 4
2 0
2 1
2 2
2 3
2 4
3 0
3 1
3 2
3 3
3 4
4 0
4 1
4 2
4 3
4 4

两个
for
循环的递归可以通过以下方式完成:

void recursion(int n,int i,int j) //void since you return no value
{
    if(i<n)
    {
        if(j<n)
        {
            printf("%d %d\n",i,j);
            recursion(n,i,++j); //never use post increment
        }
            else
            recursion(n,++i,0);
    }
}
样本输出:

1 1
1 2
1 3
1 4
2 0
2 1
2 2
2 3
2 4
3 0
3 1
3 2
3 3
3 4
4 0
4 1
4 2
4 3
4 4

为了模拟嵌套的
For
循环,每次递归调用只能增加一个计数器变量,具体取决于您是“在”内部循环还是外部循环。此外,外部循环调用需要将内部循环计数器重置为零

/* i for outer loop, j for inner loop, both going 0 to n-1 */
void recursion(int n, int i, int j)
{
  if (i < n) {
    if (j < n) {
      // inner loop when j < n
      printf("i=%d, j=%d\n",i,j); // inner loop body
      recursion(n, i, j+1); // increment inner counter only!
    } else { // when j has reached n...
      // outer loop, which restarts inner loop
      recursion(n, i+1, 0); // increment outer counter, reset inner
                            // since we're starting a new inner loop
    }
  }
}

…除了它不考虑内部循环中
i
的修改之外(在这些示例中没有发生任何情况,但是如果内部循环将
i
设置为大于
N
,递归版本将在不首先完成内部循环的情况下中断两个循环)。

用于模拟嵌套的
for
循环,对于每个递归调用,您应该只增加一个计数器变量,这取决于您是“在”内部循环还是外部循环。此外,外部循环调用需要将内部循环计数器重置为零

/* i for outer loop, j for inner loop, both going 0 to n-1 */
void recursion(int n, int i, int j)
{
  if (i < n) {
    if (j < n) {
      // inner loop when j < n
      printf("i=%d, j=%d\n",i,j); // inner loop body
      recursion(n, i, j+1); // increment inner counter only!
    } else { // when j has reached n...
      // outer loop, which restarts inner loop
      recursion(n, i+1, 0); // increment outer counter, reset inner
                            // since we're starting a new inner loop
    }
  }
}

…除了它不考虑内部循环中
i
的修改之外(在这些示例中没有发生任何情况,但是如果内部循环将
i
设置为大于
N
,递归版本将在不首先完成内部循环的情况下中断两个循环)。

最内部的
递归(n,i+1
不正确。
i
在(j)的
内没有变化
循环,因此在递归版本中不应在该点增加它。旁注:最好从“n”开始并以降序值递归。这样您就不必传递
n
。您是否有意忽略传递给函数的
j
参数值,而是在循环?@MarcB我试图更改,但输出仍然与for循环的函数不同。这是for循环函数的输出:0 1 0 2 1 2,这是递归函数的输出:0 1 0 2 1 2 1 2你的最内层的
递归(n,I+1
不正确。
I
for(j)内部没有更改
循环,因此在递归版本中不应在该点增加它。旁注:最好从“n”开始并以降序值递归。这样您就不必传递
n
。您是否有意忽略传递给函数的
j
参数值,而是在循环?@MarcB我试图更改,但输出仍然与for循环的函数不同。这是for循环函数的输出:0 1 0 2 1 2,这是递归函数的输出:0 1 0 2 1 2 1 1 2这就是我要找的!我编辑了一点代码以匹配for循环,但它起作用了!谢谢,这是我需要的。这就是我想要的ooking for!我对代码进行了一些编辑,以匹配for循环,但它很有效!谢谢,这正是我所需要的。