包含多个递归调用的递归(打印一把标尺)

在需要将一项工作不断分为两项较小的、类似的工作时,递归非常有用。

例如:请考虑使用这种方法来绘制标尺的情况。
标出两端,找到中点并将其标出。然后将同样的操作用于标尺的左半部分和右半部分。如果要进一步细分,可将同样的操作用于当前的每一部分。
递归方法有时被称为分而治之策略(divide-and-conquer strategy)

程序清单7.17使用递归函数subdivide()演示了这种方法,该函数使用一个字符串,将该字符串除两端为|字符外,其他全部为空格。
main函数使用循环调用subdivide()函数6次,每次将递归层编号加1,并打印得到的字符串。
这样,每行输出表示一层递归。该程序使用限定符std::而不是编译指令using,以提醒读者还可以采取这种方式。
//relen.cpp -- using recursion to subdivide a ruler
#include<iostream>
const int Len = 66;
const int Divs = 6;
void subdivide(char ar[], int low, int high, int level);
int main() {
	char ruler[Len];
	int i;
	for (i = 1; i < Len - 2; i++) {
		ruler[i] = ' ';
	}
	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++) {
		subdivide(ruler, min, max, i);
		std::cout << ruler << std::endl;
		for (int j = 1; j < Len - 2; j++)
			ruler[j] = ' ';	//reset to blank ruler
	}return 0;
}
void subdivide(char ar[], int low, int high, int level) {
	if (level == 0)
		return;
	int mid = (high + low) / 2;
	ar[mid] = '|';
	subdivide(ar, low, mid, level - 1);
	subdivide(ar, mid, high, level - 1);
}

下面是输出:
在这里插入图片描述
程序说明
subdivide()函数使用变量level来控制递归层。函数调用自身时,将把level减1,当level为0时,该函数将不再调用自己。注意,subdivide()调用自己两次,一次针对左半部分,另一次针对右半部分。最初的中点被用作一次调用的右端点和另一次调用的左端点。请注意,调用次数将成几何级数增长。也就是说,调用一次导致两个调用,然后导致4个调用,再导致8个调用,以此类推。这就是6层调用能够填充64个元素的原因(26=64)。
这将不断导致函数调用数(以及存储的变量数)翻倍,因此,如果要求的递归层次很多,这种递归方式将是一种糟糕的选择;然而,如果递归层次较少,这将是一种精致而简单的选择。

By《C++ Primer Plus》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值