qq_24082497
北漂程序员-阿力
采纳率100%
2016-04-02 16:24 阅读 2.6k
已采纳

c语言循环里的递归问题

2

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

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

运行结果如图:
图片说明

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

4条回答 默认 最新

  • 已采纳
    caozhy 从今以后生命中的每一秒都属于我爱的人 2016-04-02 21:07

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

     #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;
    }
    
    点赞 1 评论 复制链接分享
  • lb876864380 不許人間見白頭 2016-04-02 18:51

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

    点赞 评论 复制链接分享
  • lb876864380 不許人間見白頭 2016-04-03 01:41

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

    点赞 评论 复制链接分享
  • sinat_14884161 lilillos 2016-04-03 02:18

    在这道题里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一次。

    点赞 评论 复制链接分享

相关推荐