遞迴的視覺化(Fibonacci)
阿新 • • 發佈:2018-11-01
遞迴的視覺化
修改遞迴函式,使其能夠顯示打印出每次函式遞迴呼叫的形參的值。
每一級呼叫的輸出都帶有一級縮排,就是使得程式的輸出清晰、有趣並且有含義。
思路
以斐波那契數列為例,假設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 }