迭代遞迴和分治

2021-10-04 13:19:28 字數 2319 閱讀 5141

(分段函式表示式)

n!=1 when n=0n

(n-1

)! when n>

0(**表示)

public

static

intjiecheng

(int n)

(分段函式表示式)

f(n)

=1 when n=

0 or 1

f(n-1)

+f(n-2

) when n>

1(**表示)

public

static

intfeibonacci

(int n)

a b c 3個柱子,把a柱子上面的盤子移動到b柱子上

(**表示)

public

static

void

hanoi

(int n,

int a,

int b,

int c)

迭代分析

public

static

intbinarysearch

(int

a,int x,

int n)

//表示沒有找到

return-1

;}

int

main()

;int temp[a.length-1]

;mergesort

(a,0

, a.length-1)

;}intmergesort

(int a,

int temp,

int left,

int rgiht)

}int

merge_and_copy

(int a,

int temp,

int left,

int middle,

int right)

// 上面的迴圈結束後表示2部分中的乙個陣列已經遍歷完了,接著檢視另乙個陣列如果有剩餘,則全部直接加在temp後面。

while

(x <= middle)

while

(y <= right)

// 表示把a中從left到right的已經排好序的元素複製回去

for(

int i=

0; i <= right-left+1,

++i)

}

public

static

void

quicksort

(int

num,

int left,

int right)

1.// 普通演算法:每次都設定最左邊的元素為基準值

int key=num[left];2.

// 隨機化演算法:先隨機挑選乙個值作為key,然後把該值和首元素交換位置。

random rand =

newrandom()

;int key_id = rand.

nextint

( right-left+1)

+left;

int key = num[key_id]

; num[key_id]

= num[left]

; num[left]

= key;

// 陣列中比key小的放在左邊,比key大的放在右邊,key值下標為i

int i = left;

int j = right;

while

(i// i向右移,直到遇到比key大的值

while

(num[i]

<=key && i// 必須判斷i和j的大小,然後i和j指向的元素交換

if(i}// 此時i,j必相等,則此時把j或i的元素(比首元素小)和基準元素交換,然後此時成功分成2部分。

num[left]

=num[i]

; num[i]

= key;

quicksort

(num,left,i-1)

;quicksort

(num,i+

1,right)

;

上述**沒有把partition分開寫,如果要分開需要讓partition返回i或者j,這樣才能quciksort(a, left, i) and quicksort(a, i+1, right)

遞迴和分治

分治 divide and conquer 是基於多分枝遞迴的一種演算法。簡單的說就是把乙個大問題分解為多個型別相同的子問題,最後把這些子問題的解合併起來就是問題的解。我們看一下典型的遞迴和分治演算法。問題1 插入排序的遞迴演算法 思路 1.首先找到突破點 如果共有n個數,如果前面n 1個都已排序,...

遞迴和分治

在高階語言中,函式自己呼叫和呼叫其他函式並沒有本質的不同。我們把乙個直接呼叫自己或通過一系列的呼叫語句間接地呼叫自己的函式,稱作遞迴函式。不過,寫遞迴程式最怕的就是陷入永不結束的無窮遞迴中。切記,每個遞迴定義必須至少有乙個條件,當滿足這個條件時遞迴不再進行,即函式不再呼叫自身而是返回值。比如之前我們...

遞迴和迭代 迭代與遞迴

很多程式設計小白都會遇到 迭代 和 遞迴 的問題 包括我自己 大部分同學還是不知道迭代與遞迴的區別。下面我就嘗試用最通俗易懂的模式講解遞迴與迭代的區別。1.迭代 迭代其實很簡單,我們在程式設計中經常用到迭代。比如說 i 1 print i 這個就是乙個迭代,沒想到吧。迭代的意思其實就是在迴圈 現了參...