包含多個遞迴呼叫的遞迴(列印一把標尺)

2021-10-06 22:33:59 字數 1535 閱讀 3450

在需要將一項工作不斷分為兩項較小的、類似的工作時,遞迴非常有用。

例如:請考慮使用這種方法來繪製標尺的情況。

標出兩端,找到中點並將其標出。然後將同樣的操作用於標尺的左半部分和右半部分。如果要進一步細分,可將同樣的操作用於當前的每一部分。

遞迴方法有時被稱為分而治之策略(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 ...