回覆列表
  • 1 # 使用者3218622505484

    能採用遞迴描述的演算法通常有這樣的特徵:為求解規模為N的問題,設法將它分解成規模較小的問題,然後從這些小問題的解方便地構造出大問題的解,並且這些規模較小的問題也能採用同樣的分解和綜合方法,分解成規模更小的問題,並從這些更小問題的解構造出規模較大問題的解。特別地,當規模N=1時,能直接得解。

    遞迴演算法的執行過程分遞推和迴歸兩個階段。在遞推階段,把較複雜的問題(規模為n)的求解推到比原問題簡單一些的問題(規模小於n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是說,為計算fib(n),必須先計算fib(n-1)和fib(n-2),而計算fib(n-1)和fib(n-2),又必須先計算fib(n-3)和fib(n-4)。依次類推,直至計算fib(1)和fib(0),分別能立即得到結果1和0。在遞推階段,必須要有終止遞迴的情況。例如在函式fib中,當n為1和0的情況。

    在迴歸階段,當獲得最簡單情況的解後,逐級返回,依次得到稍複雜問題的解,例如得到fib(1)和fib(0)後,返回得到fib(2)的結果,……,在得到了fib(n-1)和fib(n-2)的結果後,返回得到fib(n)的結果。

    在編寫遞迴函式時要注意,函式中的區域性變數和引數知識侷限於當前呼叫層,當遞推進入“簡單問題”層時,原來層次上的引數和區域性變數便被隱蔽起來。在一系列“簡單問題”層,它們各有自己的引數和區域性變數。

    由於遞迴引起一系列的函式呼叫,並且可能會有一系列的重複計算,遞迴演算法的執行效率相對較低。當某個遞迴演算法能較方便地轉換成遞推演算法時,通常按遞推演算法編寫程式。例如上例計算斐波那契數列的第n項的函式fib(n)應採用遞推演算法,即從斐波那契數列的前兩項出發,逐次由前兩項計算出下一項,直至計算出要求的第n項。

    選擇排序法 是對 定位比較交換法 的一種改進。在講選擇排序法之前我們先來了解一下定位比較交換法。為了便於理解,設有10個數分別存在陣列元素a[0]~a[9]中。定位比較交換法是由大到小依次定位a[0]~a[9]中恰當的值(和武林大會中的比武差不多),a[9]中放的自然是最小的數。如定位a[0],先假定a[0]中當前值是最大數,a[0]與後面的元素一一比較,如果a[4]更大,則將a[0]、a[4]交換,a[0]已更新再與後面的a[5]~a[9]比較,如果a[8]還要大,則將a[0]、a[8]交換,a[0]又是新數,再與a[9]比較。一輪比完以後,a[0]就是最大的數了,本次比武的武狀元誕生了,接下來從a[1]開始,因為狀元要休息了,再來一輪a[1]就是次大的數,也就是榜眼,然後從a[2]開始,比出探花,真成比武大會了,當必到a[8]以後,排序就完成了。

    下面給大家一個例子:

    mai()

    {

    int a[10];

    int i,j,t;

    for ( i = 0; i

    for ( i = 0; i

    for ( j = i + 1; j

    if ( a[ i ]

    for( i = 0; i

    }

    好啦,羅嗦了半天總算把定位比較排序法講完了,這個方法不錯,容易理解,就是有點麻煩,一把椅子換來換去,哎~

    所以就有了下面的選擇排序法,開始的時候椅子誰也不給,放在一邊讓大家看著,找個人k記錄比賽結果,然後發椅子。具體來講呢就是,改進定位比較排序法,但是這個改進只是一部分,比較的次數沒變,該怎麼打還是怎麼打,就是不用換椅子了。每次外迴圈先將定位元素的小標i值記錄到K,認為a[k]是最大元素其實i=k還是a[ i ]最大,a[k]與後面的元素一一比較,該交換的也是也不換,就是把K的值改變一下就完了,最後在把a[k]與a[ i ]交換,這樣a就是最大的元素了。然後進入下一輪的比較。選擇排序法與定位比較排序法相比較,比的次數沒變,交換的次數減少了。

    下面也寫個例子:

    main()

    {

    int a[10];

    int i,j,t,k;

    for ( i = 0; i

    for ( i = 0; i

    for ( j = i + 1; j

    if ( a[ k ]

    t = a[ i ]; a[ i ] = a[ k ]; a[ k ] = t; /* t 發放獎品*/

    }

    for( i = 0; i

    }

  • 中秋節和大豐收的關聯?
  • 三月桃花水導學案怎麼寫的答案?