漢諾塔問題, 用遞迴方法求集合中的中位數

2022-03-29 13:37:13 字數 1025 閱讀 9669

列印解決漢諾塔問題的所有步驟

1

void move(int n, int start, int goal, int

temp)29

1011 }

用遞迴方法求集合中的中位數

1

void swap(elementtype *x, elementtype *y)28

9 elementtype findkthlargest(elementtype s, int k, int left, int

right)

10 23 swap(&s[left - 1], &s[l]);

24if ((left - l - 1) >=k)

25return findkthlargest(s, k, l, left - 2); //

left - 1是基準,所以下一次遞迴的右邊界應該是left - 2

26else

27if ((left - l - 1) < k - 1)28

return findkthlargest(s, k - (left - l - 1) - 1, left, r); //

k 先減去第乙個集合的left - l - 1個元素,在減去基準元素,所以下一次遞迴應該是在第二個集合中求第k - (left - l - 1) - 1個元素

29else

30return e; //

找到,返回31}

3233

//封裝前面這個查詢函式

34 elementtype median(elementtype s, int

n)35

這個方法實際上利用了和快速排序相同的思路

簡單選取s中的第乙個元素e,根據e將集合s分為和大於等於e的元素集合s1、小於e的元素集合s2; 然後通過判別集合s1的大小,將從s集合中找第k大數問題轉換為在s1 和s2中的查詢問題,由於s1或s2中的集合規模都比s小,這樣就將複雜的問題轉化為規模相對較小的問題,這也是遞迴函式的設計基礎

用遞迴求漢諾塔問題 演算法筆記

想法 1 n從a移動到b,c為輔助 等價於 1 1 n 1從a移動到c,b為輔助 2 把n從a移動到b 3 1 n 1從c移動到b,a為輔助 然後依次迴圈 1 2 3 include include using namespace std n 盤子數量 from原始柱子 to目標柱子 help 輔助...

漢諾塔遞迴方法

hannuota int n,char x,char y,char z x柱子是要移動的柱子,y柱子是x移動要借助的柱子,z柱子是要放在這個柱子上 在 hannuota函式中的遞迴判斷方法 如果是1個盤子 直接將a柱子上的盤子從a移到c 否則先將a柱子上的n 1個盤子借助c移到b 直接將a柱子上的盤...

漢諾塔問題(遞迴)

題目描述 對於傳統的漢諾塔遊戲我們做乙個拓展,我們有從大到小放置的n個圓盤,開始時所有圓盤都放在左邊的柱子上,按照漢諾塔遊戲的要求我們要把所有的圓盤都移到右邊的柱子上,請實現乙個函式列印最優移動軌跡。給定乙個int n,表示有n個圓盤。請返回乙個string陣列,其中的元素依次為每次移動的描述。描述...