突然发现好像弄不懂递归的调用过程了
查看原帖
突然发现好像弄不懂递归的调用过程了
392327
段落楼主2022/9/13 16:09
#include<bits/stdc++.h>
using namespace std;
string s,s0[266],s1[266];
string DFS(string s)
{	
	cout<<s<<endl;
	if(s==s0[s.size()])
	{
		return "A";
	}
	if(s==s1[s.size()])
	{
		return "B";
	}
	return 'C'+DFS(s.substr(0,s.size()/2))+DFS(s.substr(s.size()/2,s.size()/2));
}
int main(){
	cin>>s;
	s0[1]="0";
	s1[1]="1";
	for(int i=2;i<=256;i++)
	{
		s0[i]=s0[i-1]+'0';
		s1[i]=s1[i-1]+'1';
	}
	cout<<DFS(s);
	return 0;
}

提交代码AC之后,突然想看一下递归的过程是怎么样的,就在递归函数DFS里面加了一句cout<<s<<endl; 然后我发现它的执行过程和我平时了解的有所不同。它的输出是这样的:

01001011

1011

11

10

0

1

0100

00

01

1

0

CCCABACCBAB

这个结果和我手动模拟的正好相反。 我平时预想中是这样输出的:

01001011

0100

01

0

1

00

1011

10

1

0

11

CCCABACCBAB

然后我上网找了好几篇文章,结果和我平时所了解的递归过程一样。

我就想是不是上面的代码传入的是字符串的原因,就修改成传入下标,发现输出还是没有改变。

所以上面的代码为什么在把二分递归的时候会先执行后面一个递归呢?

用递归求斐波那契数列的时候,代码结构也很相似,但是执行的顺序和上面的代码(包括修改传入下标后)就不一样。

2022/9/13 16:09
加载中...