#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
然后我上网找了好几篇文章,结果和我平时所了解的递归过程一样。
我就想是不是上面的代码传入的是字符串的原因,就修改成传入下标,发现输出还是没有改变。
所以上面的代码为什么在把二分递归的时候会先执行后面一个递归呢?
用递归求斐波那契数列的时候,代码结构也很相似,但是执行的顺序和上面的代码(包括修改传入下标后)就不一样。