递归的可视化(Fibonacci)

递归的可视化

修改递归函数,使其能够显示打印出每次函数递归调用的形参的值。

每一级调用的输出都带有一级缩进,就是使得程序的输出清晰、有趣并且有含义。

思路

以斐波那契数列为例,假设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数列
");
16     printf("请输入希望生成的数列的项数:");
17     scanf("%d", &seriesSize);
18 
19     printf("
Fibonacci数列的第%d项是:%d", seriesSize, Fibonacci(seriesSize));
20     printf("
");
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
", 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
");
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
");
66         return 0;
67     }
68     return stack[tos];
69 }
原文地址:https://www.cnblogs.com/lfri/p/9889784.html