C Programming - Two for loops to recursion

喜你入骨 提交于 2019-12-31 04:55:09

问题


I was trying to make recursive function that would simulate two for loops. So, function would have to do this:

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);
        }
    }
}

but, i want it to be recursive. I tried something like:

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

I would call recursive one in main like

recursion(10, 0, 1);

but output is not the same for those two version of function. May anyone tell me where am I mistaking with the recursive one?


回答1:


For simulating nested for loops, you should only increment one of your counter variables for each recursive call, depending on whether you're "in" the inner or outer loop. Also, the outer loop calls need to reset the inner loop counter to zero.

/* 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
    }
  }
}

If called initially as recursion(N, 0, 0) this should be roughly equivalent to:

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

...except that it doesn't account for modifications of i within the inner loop (none happen in these examples, but if the inner loop did set i larger than N, the recursive version would break both loops without finishing the inner loop first).




回答2:


I am not sure whether you can replace two for loops with one recursive function. You can easily make it work with couple of recursive functions.

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);
   }
}



回答3:


recursion of two for loops can be done this way:

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);
    }
}

Sample input: (arguments are sent from main() function)

5 1 1

Sample output:

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


来源:https://stackoverflow.com/questions/37751253/c-programming-two-for-loops-to-recursion

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!