递归的可视化
修改递归函数,使其能够显示打印出每次函数递归调用的形参的值。
每一级调用的输出都带有一级缩进,就是使得程序的输出清晰、有趣并且有含义。
思路
以斐波那契数列为例,假设n=5,递归的形参如下:
1------------------- 5 2-----------------/ \ 3---------------4 3 4-------------/ \ / \ 5-----------3 2 2 1 6---------/ \ 7--------2 1
效果图如下:
代码实现
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define MAX 50 4 5 long Fibonacci(long num); 6 void push(int i); 7 int pop(void);/*堆栈*/ 8 int stack[MAX];/*栈顶*/ 9 int tos = 0; 10 11 /*主函数*/ 12 int main() 13 { 14 int seriesSize = 0;/*数列的长度*/ 15 printf("此函数将生成Fibonacci数列\n"); 16 printf("请输入希望生成的数列的项数:"); 17 scanf("%d", &seriesSize); 18 19 printf("\nFibonacci数列的第%d项是:%d", seriesSize, Fibonacci(seriesSize)); 20 printf("\n"); 21 22 return 0; 23 }/*end miain*/ 24 25 /*计算Fibonacci数列的第n项*/ 26 long Fibonacci(long num) 27 { 28 static int d = 0; 29 if (d == 0) 30 push(0); 31 32 d++; 33 for (int i = 0; i < 6 * d; i++) 34 printf(" "); 35 printf("第%d层递归调用:形参num=%ld\n", d, num); 36 if (num == 0 || num == 1) 37 { 38 d = pop(); 39 return 1; 40 } 41 else 42 { 43 push(d); 44 return(Fibonacci(num - 1) + Fibonacci(num - 2)); 45 } 46 } 47 48 /*函数push:入栈函数*/ 49 void push(int i) 50 { 51 if (tos >= MAX) 52 { 53 printf("Stack Full\n"); 54 } 55 stack[tos] = i; 56 tos++; 57 } 58 59 /*函数pop:出栈函数*/ 60 int pop(void) 61 { 62 tos--; 63 if (tos < 0) 64 { 65 printf("Stack Underflow\n"); 66 return 0; 67 } 68 return stack[tos]; 69 }