编程|递归调用的前进段与返回段及前循环与后循环
我们知道,控制结构的选择和循环在编译成汇编后,最终是通过jcc指令集和ret来实现的。类似的,选择结构的递归调用也形成了同等意义上的循环结构。
以递归调用语句为基准,作为调用基点,此前的代码在调用前进段执行,此后的代码在返回段执行,调用点前的语句形成前循环(参数顺序使用),调用点后的语句形成前循环(参数逆序使用)。
1 调用点前的语句形成前循环(参数顺序使用)
#include
void frontBackLoop(int n){
printf("f%d ",n);
// 调用点前的语句形成前循环(参数顺序使用)
if(n==0) return;
else frontBackLoop(n-1);
// 调用基点,此前的代码在调用前进段执行,此后的代码在返回段执行
// printf("b%d ",n);
// 调用点后的语句形成前循环(参数逆序使用)
}
int main(){
frontBackLoop(4);
getchar();
return 0;
}
/*f4 f3 f2 f1 f0*/
图示:
2 调用点后的语句形成前循环(参数逆序使用)
#include
void frontBackLoop(int n){
// printf("f%d ",n);
// 调用点前的语句形成前循环(参数顺序使用)
if(n==0) return;
else frontBackLoop(n-1);
// 调用基点,此前的代码在调用前进段执行,此后的代码在返回段执行
printf("b%d ",n);
// 调用点后的语句形成前循环(参数逆序使用)
}
int main(){
frontBackLoop(9);
getchar();
return 0;
}
/*b1 b2 b3 b4 b5 b6 b7 b8 b9*/
3 调用点前、后的语句形成前循环和后循环
#include
void frontBackLoop(int n){
printf("f%d ",n);
// 调用点前的语句形成前循环(参数顺序使用)
if(n==0) return;
else frontBackLoop(n-1);
// 调用基点,此前的代码在调用前进段执行,此后的代码在返回段执行
printf("b%d ",n);
// 调用点后的语句形成前循环(参数逆序使用)
}
int main(){
frontBackLoop(4);
getchar();
return 0;
}
/*f4 f3 f2 f1 f0 b1 b2 b3 b4*/
图示: