在这个例子当中将使用递归来实现一个打印标尺刻度的方法。首先是递归,函数调用其本身就叫递归,在需要将一项工作不断分为两项较小的、类似的工作时,递归非常有用,递归的方法被称为分而治之策略。

下面是一个win32控制台程序的代码:

 #include <iostream>

 using namespace std;
const int Len = ;
const int Divs = ;
void subdivide(char ar[], int low, int hight, int level);
int main()
{
char ruler[Len];
int i;
for (i = ; i < Len - ; i++)
ruler[i] = ' ';
ruler[Len - ] = '\0';
int max = Len - ;
int min = ;
ruler[min] = ruler[max] = '|';
cout << ruler << endl;
for (i = ; i <= Divs;i++)
{
subdivide(ruler, min, max, i);
cout << ruler << endl;
for (int j = ; j < Len - ; j++)
ruler[j] = ' ';
} return ;
}; void subdivide(char ar[], int low, int hight, int level)
{
if (level == )
return;
int mid = (hight + low) / ;
ar[mid] = '|';
//递归调用
subdivide(ar, low, mid, level - );
subdivide(ar, mid, hight, level - );
}

这个程序清单中,subdivide()函数使用变量level来控制递归层。函数调用自身时,将把level减1,当level为零时,该函数将不再调用自己。subdivide函数调用自己两次,一次针对左半部分,另一次针对右半部分,调用的次数也将呈几何级数增长,也就是说,调用一次导致两个调用,然后导致四个调用,在导致八个调用,以此类推。这就是6层调用能填充64个元素的原因(2的6次方等于64)。这将不断导致函数调用数翻倍,如果要求的递归层次很多,这种递归方式将使一种糟糕的选择;递归调用适合用于递归层次较少的的情况。

用C++实现绘制标尺的方法,使用了递归的更多相关文章

  1. Android中View的绘制过程 onMeasure方法简述 附有自定义View例子

    Android中View的绘制过程 onMeasure方法简述 附有自定义View例子 Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android fr ...

  2. Python解析Wav文件并绘制波形的方法

    资源下载 #本文PDF版下载 Python解析Wav文件并绘制波形的方法 #本文代码下载 Wav波形绘图代码 #本文实例音频文件night.wav下载 音频文件下载 (石进-夜的钢琴曲) 前言 在现在 ...

  3. 【转】Android中View的绘制过程 onMeasure方法简述 附有自定义View例子

    Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android framework将会处理绘制过程,Activity只需提供它的布局的根节点. 绘制过程从布 ...

  4. 几何画板给word绘制图形的方法

    几何画板是一款专门用来绘图的工具,它里面有很多的绘图工具和功能菜单,都是专门为画图而设计的,比如一些理科的期刊杂志论文出版的时候,里面所涉及到的图形很多都是用几何画板画出来的.下面就根据几何画板教程来 ...

  5. Raphael绘制圆圈环绕方法

    $scope.toRadians = function (degrees) { return degrees * (Math.PI / 180); } $scope.toDegrees = funct ...

  6. canvas绘制清晰的方法

    很早就开始使用canvas,包括自己绘制各种图形,以及作为画布提供给诸如echarts,当canvas绘制细线条,特别是关于文字绘制会出现很模糊或者锯齿的感觉. <canvas ref=&quo ...

  7. createjs绘制扇形的方法

    扇形由三段线条组成,两条直线和一条弧线,直线可以用createjs中的lineTo函数画出,弧线用Graphics.arc函数来画. 一.关于createjs中的Graphics.Arc API Gr ...

  8. matlab绘制直方图的方法

    直接上代码,利用hist绘制频次直方图和频率直方图... %rand Fs=1000;N=10000; t=0:1/Fs:(N-1)/Fs; X1=rand(1,length(t)); subplot ...

  9. QPainter 提高绘制效率的方法

    原文: https://my.oschina.net/u/3919756/blog/1944747 如果我们用painter一个一个的绘制直线,圆等在控件上,绘制效率会不高.为了提高效率,我们可以设置 ...

随机推荐

  1. android86 监听SD卡状态,勒索软件,监听应用的安装、卸载、更新,无序广播有序广播

    * 添加权限 <uses-permission android:name="android.permission.RECEIVE_SMS"/> * 4.0以后广播接收者 ...

  2. Android开发之View重写相关API-onLayout,onMeasure,MeasureSpec

     1.onLayout android.view.ViewGroup protected void onLayout(boolean changed, int l, int t, int r, int ...

  3. VC++/MFC操作ini配置文件详解

    在我们写的程序当中,总有一些配置信息需要保存下来,以便完成程序的功能,最简单的办法就是将这些信息写入INI文件中,程序初始化时再读入.具体应用如下: 一.将信息写入.INI文件中. 1.所用的WINA ...

  4. step2 uboot tag存储主要部分代码

      cmd_bootm.c //传递给内核的参数      int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])     ...

  5. c#不重复的排序方法

    public int getRandom(int num) { Thread.Sleep(5); // Random ro = new Random(unchecked((int)DateTime.N ...

  6. HDU-1012(水题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1012 分析:就按题目给的公式一步步输出就行了. #include<stdio.h> #include ...

  7. Js 命名空间注册方法

    MyApp = { namespace: function () { var a = arguments, o = null, i, j, d, rt; for (i = 0; i < a.le ...

  8. Tomcat - java.lang.UnsupportedClassVersionError:Unsupported major.minor version 51.0 (unable to load class com.microsoft.sqlserver.jdbc.SQLS

    今天使用Tomcat连接sql Server 2008 enterprise的时候,报错: HTTP Status 500 - Servlet execution threw an exception ...

  9. Struts2多文件上传

    第一步:首先创建一个多文件上传的页面 <html> <head> <meta http-equiv="Content-Type" content=&q ...

  10. Shell编程之Shift的用法

    位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1. 非常 ...