1. 程式人生 > >遞迴的視覺化(Fibonacci)

遞迴的視覺化(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數列\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 }