c语言循环里的递归问题

问题描述

c语言循环里的递归问题

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

#include
void test(int n)
{
int x=0,i=0;
if(n==1){
printf("n:%d x:%d i:%d
",n,x,i);
return ;
}else{
printf("n:%d x:%d i:%d
",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,x,i);
        goto brkpos;
    }else{
        printf("n:%d  x:%d   i:%d
",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;
}

解决方案二:

!为了便于理解我加了一点东西 图片说明
另外我画了一张简图,
这一切的问题就是在理解不符合条件时,在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一次。

解决方案四:

C语言里的递归
八皇后问题 C语言,递归,非递归,循环!

解决方案五:

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

时间: 2024-08-31 09:43:27

c语言循环里的递归问题的相关文章

二进制-C语言for循环里没有循环体,空白语句有什么作用

问题描述 C语言for循环里没有循环体,空白语句有什么作用 程序是输入一个二进制数,然后求这个二进制数的补码. 第一个for中并没有循环体,注释掉以后无法运行. 另外这个程序是怎么做到当末位为1时,末位加1等于0,并且向前进一位的?而不是末位加1等于2? 解决方案 C语言 for循环8.从零开始学习C语言--while循环语句C语言基础练习:在Xcode中练习的for循环语句 解决方案二: 第一个for循环是找到这个二进制数第一个1的位置,如输入0001010,求得i=3. 解决方案三: 第一个

c语言向量里放的另外几个向量,怎么访问里面向量里元素的个数

问题描述 c语言向量里放的另外几个向量,怎么访问里面向量里元素的个数 c语言向量里放的另外几个向量,怎么访问里面向量里元素的个数?? 解决方案 http://blog.sina.com.cn/s/blog_9ce5a1b501016rac.html 解决方案二: 双层循环遍历向量来获取对应元素.

怎么在循环里用setTimeout,或者延迟?

问题描述 怎么在循环里用setTimeout,或者延迟? 解决方案 递归,不能直接for function execFor(i, max) { alert(i); i++; if (i <= max) setTimeout(function () { execFor(i, max); }, 1000); } execFor(0,3)

score-ASP页面修改循环里 怎么相加

问题描述 ASP页面修改循环里 怎么相加 <% sql = "SELECT * FROM Accounts.dbo.view_2 where IsAndroid = 0" set rs = conn.execute(sql) if not rs.eof then do while not rs.eof userid=rs("USERID") set rxsum=conn.execute("SELECT SUM(Score) FROM Accounts

编程-关于c语言循环嵌套的问题

问题描述 关于c语言循环嵌套的问题 完全数是其各因子之和正好等于本身的数,如6=1+2+3,28=1+2+4+7+14所以6,8都是完全数,请编程找出2-20000内的所有完全数.输入整数n,输出第n个完全平方数.第一种: #include <stdio.h> void main() { int ins=0k=0; scanf(""%d""&n); for(i=2;i<=20000;i++s=0) { for(int j=1;j<i;

怎么删除循环里面的marker(asp.net)

问题描述 怎么删除循环里面的marker(asp.net) function play() { window.run = function () { var j = 0; var ico = icon_str[j]; var myIcon = new BMap.Icon(""../"" + ico + """" new BMap.Size(25 22) { imageOffset: new BMap.Size(0 0) //

c语言-InitTriplet里的(Triplet &amp;amp;amp;T)是什意思,是严蔚敏数据结构(C语言)里的。

问题描述 InitTriplet里的(Triplet &T)是什意思,是严蔚敏数据结构(C语言)里的. include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int ElemType; typedef ElemType* Triplet; Status Ini

c语言 循环-初学渣.关于C语言for循环的省略问题

问题描述 初学渣.关于C语言for循环的省略问题 int i=-2;for(;i++;);printf(""%d ""i)(节选,如上所示)最后输出的结果是多少,为什么?新人,求不喷... 解决方案 C语言初学关于for循环的自己的见解C语言for循环c语言循环-for 解决方案二: 本人同上,不知道你的循环条件的说 解决方案三: 你的for循环有问题for(;i++;)判断永远为真,会无限循环的因为i++为真,因改写为for(;i<....;i++) 解决方

class文件-java for循环里的变量反编译出问题

问题描述 java for循环里的变量反编译出问题 for(int i=0;i<10;i++){ int k = 10; } 编译出的class文件,用jd-gui反编译出来的java文件,结果变成了 for(int i=0;i<10;i++){ i = 10; } 然后如果是 for(int i=0;i<10;i++){ int k = 10; System.out.println(k); } 则反编译出来的就是 for(int i=0;i<10;i++){ int k = 10