本文原創文章,轉載註明出處,博客地址 https://segmentfault.com/u/to... 第一時間看後續精彩文章。以爲好的話,順手分享到朋友圈吧,感謝支持。segmentfault
咱們把一個直接調用本身或經過一系列的調用語句間接地調用本身的函數,稱作遞歸函數數組
//版本1:迭代版本 func Fbi1(i int) int { switch i { case 0: return 0 case 1: return 1 default: arr := make([]int, i+1, i+1) arr[0] = 0 arr[1] = 1 for j := 2; j <= i; j++ { arr[j] = arr[j-1] + arr[j-2] } return arr[i] } }
//版本2:遞歸版本 func Fbi2(i int) int { switch i { case 0: return 0 case 1: return 1 default: //遞歸調用 return Fbi2(i-1) + Fbi2(i-2) } }
視不一樣狀況選擇不一樣的代碼實現方式函數
遞歸過程分爲前行和退回階段,編譯器使用棧實現遞歸;前行階段,每一層遞歸,函數的局部變量、參數值以及返回地址都被壓入棧,在退回階段,位於棧頂的局部變量、參數值和返回地址被彈出,恢復了調用的狀態code
咱們把隊列的這種頭尾相接的順序存儲結構稱爲循環隊列遞歸
隊列的鏈式存儲結構,就是線性表的單鏈表,只能尾進頭出隊列
總結:能夠肯定隊列長度最大值的狀況下,建議用循環隊列,若是沒法預估隊列長度,則用鏈隊列內存