c语言循环里的递归问题

求大神们,帮我分析一下这个程序怎么运行的

#include
void test(int n)
{
int x=0,i=0;
if(n==1){
printf("n:%d x:%d i:%d\n",n,x,i);
return ;
}else{
printf("n:%d x:%d i:%d\n",n,x,i);

    for(i=0;i<3;i++){
        test(n-1);
        x=1;
    }
}

}

int main()
{
test(3);
return 0;
}

运行结果如图:
图片说明

你的程序可以改写成不用递归,使用堆栈的形式:

 #include<stack>
#include<stdio.h>
using namespace std;

void test(int n)
{
    stack<int> st;
funcstart:
    int x=0,i=0;
    if(n==1){
        printf("n:%d  x:%d   i:%d\n",n,x,i);
        goto brkpos;
    }else{
        printf("n:%d  x:%d   i:%d\n",n,x,i);

        for(i=0;i<3;i++){
            st.push(x);
            st.push(i);
            st.push(n);
            n=n-1;
            goto funcstart;
brkpos:
            if (st.empty()) return;
            n=st.top();
            st.pop();
            i=st.top();
            st.pop();
            x=st.top();
            st.pop();
            x=1;
        }
    }
    goto brkpos;
}

int main()
{
    test(3);
    return 0;
}

首先你得一步一步的走 最先由test(3)进入,然后因为不满足,所以进入了else 就进入了test(2),继续不满足 进入 test(1),输出,然后满足结束,从test(1)跳出来

!为了便于理解我加了一点东西 图片说明
另外我画了一张简图,图片说明
这一切的问题就是在理解不符合条件时,在for循环中的展示,另外每次调用函数text()都要对 x和i初始为0,所以每次输出他们都是那个结果。
如果还有什么没有懂得可以继续问我,

在这道题里test(3),会打印3,0,0,同时嵌套有一个循环;
然后test(2),打印2,0,0。
但是在test(2)这个过程中,也嵌套有一个循环,
这个循环会把1,0,0打印三次;
对于test(3)里的循环会把test(2)这个循环执行三次,也就是每次都打印2,0,0
然后test(2)自己执行三次循环打印1,0,0三次。
所以除了第一次打印3,0,0以为,剩下每次都是2,0,0;1,0,0;1,0,0;1,0,0这样的格式。
再归纳一下就是test(3)执行3次,但是test(3)执行的内容是test(2),test(2)做的事就是打印2,0,0;1,0,0;1,0,0;1,0,0。
为什么打印1,0,0三次,是因为每次执行test(2)就会执行里面的循环三次,每次循环是打印1,0,0一次。