C编程-两个用于递归的循环
我试着做一个递归函数来模拟两个for循环。因此,函数必须执行以下操作: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); } } } 但这两个版本的函数的输出不同。有谁能告诉我我把递归函数错在哪里了吗?我不确定你能否用一个递归函
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循环,但它很有效!谢谢,这正是我所需要的。