遞迴可以實現分治這種演算法,就是把乙個複雜的大問題,分解成若干個相同的小分問題,直到問題全部解決。
斐波那契數列
#include
intget_fibonacci
(int number)
//第三項開始的斐波那契數列是前2項的和
首先遞迴要判斷最後一步的情況(就是退出函式的條件)最後一塊疊上去就行了 x->y(如下圖)
然後判斷別的情況(前面的步驟)
將x上面的n-1個盤子通過z放到y上去
這時x只剩下乙個盤子將盤子移到z上去
然後將n-1個盤子用遞迴的方法從y->z移過去就行了
/*1、使用遞迴模擬漢諾塔的移動過程。*/
#include
void
move
(char x,
char y,
char z,
int number)
else
}int
main()
思路和漢諾塔一樣選取元素進行交換位置從第乙個元素開始,和後面的依次交換,交換完成一次要用遞迴對後面的元素也進行排序,如果頭元素到最後了就輸出序列即可,拍完一趟之後要對元素進行歸位,方便下面的元素進行排序。
/*2、全排列0~9。*/
#include
void
sort
(int head,
int last,
int arr)
printf
("\n");
}//不是最後就要算出後面的數的排序
else}}
intmain()
;sort(0
,9,arr)
;return0;
}
遞迴函式每呼叫一次都會在棧記憶體產生乙份自己的拷貝,直到達到出口,才一層釋放,因此使用遞迴非常耗費記憶體,與迴圈相比速度非常慢。
建議:能用迴圈解決的問題不要使用遞迴。
比如斐波那契數列用迴圈可以很快的得到結果,雖然看上去我們求幾項時間差不多,但是當基數變大到一定的程度,時間的差將會是令人吃驚的
遞迴優點:
1. 簡潔
2. 容易理解思路清晰
3. 可以解決非線性的執行過程。
缺點:2.遞迴中很多計算都是重複的,由於其本質是把乙個問題分解成兩個或者多個小問題,多個小問題存在相互重疊的部分,則存在重複計算,如fibonacci斐波那契數列的遞迴實現
3.呼叫棧可能會溢位,其實每一次函式呼叫會在記憶體棧中分配空間,而每個程序的棧的容量是有限的,當呼叫的層次太多時,就會超出棧的容量,從而導致棧溢位
總結為1、耗費記憶體、速度慢
7 15的一些小練習
使用turtle庫,繪製乙個八邊形。圖形如下所示 import turtle as t t.setup 800,600 t.pensize 5 t.seth 22.5 t.pencolor black t.circle 80,steps 8 t.done 使用turtle庫,繪製乙個八角圖形。圖形如...
接觸python的一些小練習
目錄 a nick handsome height 180 age 18 weight 140 print 身高 a 21 18 print 年齡 a 13 11 print 體重 a 3 t input 輸入體重 if t 3 jin kg eval t 3 2 print str kg kg e...
關於編譯的一些小知識
gnu編譯器 g 編譯 c 程式 在windows下,進入源 所在的路徑下,在命令列中輸入 g o test.exe test.cpp將test.cpp 編譯生成 test.exe 可執行檔案,如果沒有 o test.exe 選項,預設生成 a.exe 在linux下,進入源 所在的路徑下,在命令列...