在需要將一項工作不斷分為兩項較小的、類似的工作時,遞迴非常有用。
例如:請考慮使用這種方法來繪製標尺的情況。
標出兩端,找到中點並將其標出。然後將同樣的操作用於標尺的左半部分和右半部分。如果要進一步細分,可將同樣的操作用於當前的每一部分。
遞迴方法有時被稱為分而治之策略(divide-and-conquer strategy)
程式清單7.17使用遞迴函式subdivide()演示了這種方法,該函式使用乙個字串,將該字串除兩端為|字元外,其他全部為空格。
main函式使用迴圈呼叫subdivide()函式6次,每次將遞迴層編號加1,並列印得到的字串。
這樣,每行輸出表示一層遞迴。該程式使用限定符std::而不是編譯指令using,以提醒讀者還可以採取這種方式。
-- using recursion to subdivide a ruler
#include
const
int len =66;
const
int divs =6;
void
subdivide
(char ar,
int low,
int high,
int level)
;int
main()
ruler[len -1]
='\0'
;int max = len -2;
int min =0;
ruler[min]
= ruler[max]
='|'
; std::cout << ruler << std::endl;
for(i =
1; i <= divs; i++
)return0;
}void
subdivide
(char ar,
int low,
int high,
int level)
下面是輸出:
程式說明
subdivide()函式使用變數level來控制遞迴層。函式呼叫自身時,將把level減1,當level為0時,該函式將不再呼叫自己。注意,subdivide()呼叫自己兩次,一次針對左半部分,另一次針對右半部分。最初的中點被用作一次呼叫的右端點和另一次呼叫的左端點。請注意,呼叫次數將成幾何級數增長。也就是說,呼叫一次導致兩個呼叫,然後導致4個呼叫,再導致8個呼叫,以此類推。這就是6層呼叫能夠填充64個元素的原因(26=64)。
這將不斷導致函式呼叫數(以及儲存的變數數)翻倍,因此,如果要求的遞迴層次很多,這種遞迴方式將是一種糟糕的選擇;然而,如果遞迴層次較少,這將是一種精緻而簡單的選擇。
by《c++ primer plus》
遞迴方式列印多個陣列的笛卡爾積
先宣告兩個全域性變數 private static int length private static int count 呼叫此方法,引數為可變長陣列 private static void execute string.args 遞迴呼叫列印笛卡爾積 private static void pr...
lambda遞迴呼叫的一般方法
普通遞迴呼叫,例如求階乘 def fact n if n 0 return 1 else return n fact n 1 被遞迴函式需要乙個固定名稱,以期在函式中引用此名稱進行遞迴。那麼,如果單純使用lambda匿名函式,應如何實現遞迴。以階乘為例,用lambda匿名函式遞迴可寫為 print ...
專題一 遞迴呼叫與列舉演算法的例子
bnuoj4116 輸入資料只有乙個數n 範圍 n 0 n 30000 我先後寫了兩個版本 cpp view plain copy include include include using namespace std intmain if i int sqrt a 1 else return 0 ...