用C++实现绘制标尺的方法,使用了递归
在这个例子当中将使用递归来实现一个打印标尺刻度的方法。首先是递归,函数调用其本身就叫递归,在需要将一项工作不断分为两项较小的、类似的工作时,递归非常有用,递归的方法被称为分而治之策略。
下面是一个win32控制台程序的代码:
1 #include <iostream> 2 3 using namespace std; 4 const int Len = 66; 5 const int Divs = 6; 6 void subdivide(char ar[], int low, int hight, int level); 7 int main() 8 { 9 char ruler[Len]; 10 int i; 11 for (i = 0; i < Len - 2; i++) 12 ruler[i] = ' '; 13 ruler[Len - 1] = '\0'; 14 int max = Len - 2; 15 int min = 0; 16 ruler[min] = ruler[max] = '|'; 17 cout << ruler << endl; 18 for (i = 1; i <= Divs;i++) 19 { 20 subdivide(ruler, min, max, i); 21 cout << ruler << endl; 22 for (int j = 0; j < Len - 2; j++) 23 ruler[j] = ' '; 24 } 25 26 return 0; 27 }; 28 29 void subdivide(char ar[], int low, int hight, int level) 30 { 31 if (level == 0) 32 return; 33 int mid = (hight + low) / 2; 34 ar[mid] = '|'; 35 //递归调用 36 subdivide(ar, low, mid, level - 1); 37 subdivide(ar, mid, hight, level - 1); 38 }
这个程序清单中,subdivide()函数使用变量level来控制递归层。函数调用自身时,将把level减1,当level为零时,该函数将不再调用自己。subdivide函数调用自己两次,一次针对左半部分,另一次针对右半部分,调用的次数也将呈几何级数增长,也就是说,调用一次导致两个调用,然后导致四个调用,在导致八个调用,以此类推。这就是6层调用能填充64个元素的原因(2的6次方等于64)。这将不断导致函数调用数翻倍,如果要求的递归层次很多,这种递归方式将使一种糟糕的选择;递归调用适合用于递归层次较少的的情况。