问题描述
- 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)跳出来