编程

编程|递归调用的前进段与返回段及前循环与后循环

1400 2022-02-12 13:02:25

我们知道,控制结构的选择和循环在编译成汇编后,最终是通过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*/

图示: