C++递归用法
转自:http://bbs.ikaka.com/showtopic-664019.aspx
简单谈谈C++ 递归的思想实现以及和循环的关系
很多初学者往往对递归迷惑不解,也在这上面花了不少的时间。其实教材上的例子很经典,只是它说的有一些唠叨了。初学者会看的头大的。编程是解决问题的,而现实中很多的问题都是比较简单的,没有象汉诺塔那么复杂。我们也不必追究递归到底是怎样实现的,我们只是要会用递归,会用递归来为我们解决一些问题,这就行了。
首先来看一个例子:
有一个Febonacci序列:
1,1,2,3,5,8,13,,21,34........
它的问题是:求这个序列中的第N个数。
由于它的函数原形是:f(N)=f(n-1)+f(n-2)
这用递归很容易就可以写出代码来,一点都不费事:
int Febc(int n) {
if(n<3) return (1);
else
return (Febc(n-1)+Febc(n-2));
}
噢~~~~~也许你会说递归真是太简单了,简直就是一个数学模型嘛,呵呵。
其实,递归函数的工作过程就是自己调用自己。有一些问题用递归就很容易解决,简单的你自己都会吃惊。
我们做事情,一般都是从头开始的,而递归却是从末尾开始的。比如上面的函数吧,当n>3时,它显然只能求助于n-1,n-2。而(n-1)>2,(n-2)>2时,它们就求助于:(n-1)-1,(n-1)-2;(n-2)-1,(n-2)-2;然后··············直到(n-k)<3,(n-k-1)<3时,函数Febc终于有了返回值1 了,它再从头开始计算,然后一直算到n 为止。
通过上面的例子,我们知道递归一定要有一个停止的条件,否则递归就不知道停止了。在上面的例子中, if(n<3) return (1); 就是停止的条件。
然而,使用递归的代价是十分巨大的:它会消耗大量的内存!!递归循环时它用的是堆栈,而堆栈的资源是十分有限的。上面的例子你只能用一个很小的n值。如果n=20,即Febc(20)的话,它将调用Febc(N)函数10000多次!!!而上面一个例子用循环也是十分容易写的:
/*using turboc2*/
int febc(int);
main()
{
int n;
scanf("%d",&n);
febc(N);
}
int febc(int n)
{
int a[3],i;
a[0]=a[1]=a[2]=1;
for(i=3;i<=n;i++)
a[i%3]=a[(i+1)%3]+a[(i+2)%3]; /*实现 Febc(I)=Febc(i-1)+Febc(i-2)*/
printf("\n%d\n",a[n%3]);
}
有兴趣者不妨输入一个较大的n值,然后比较比较这二个函数计算的速度。当然, 如果你使用的n太大的话,递归可能发生错误。如果死机了可别骂我哦~~~ 我已经提醒过你了 :)
现在我们再来看看一个求从1 加到100的循环:
/*turboc2*/
main()
{ int i,n;
for(i=1;i<101;i++)
n+=i; }
这很简单没什么可说的。 但是,你能不能写出相应的递归函数呢?
下面就是递归(请注意了,这种做法不推荐!! 我只是为了说明问题才这么写的。)
/*using Turboc2*/
int a=0;
int account(int);
main()
{
account(100);
printf("%d",a);
}
int account(int i)
{
if(i==1) return 1; /*停止条件*/
else
return (n+f(n-1)); /*此句有问题*/
}
在C/C++的问题中,我曾经回答过这样的一个问题:
若一头小母牛,从出生起第四个年头开始每年生一头母牛,按此规律,第n年时有多少头母牛? 请问如何用递归涵数求此问题?
先写出函数表达式:f(N)=f(n-1)+f(n-3)
为什么f(N)=f(n-1)+f(n-3)呢,请看:
f(N)-f(n-1)=f(n-3)
因为第n年要比n-1年多的牛,都是大于三岁的牛生的小牛,而f(n-3)正是那些在n年大于三岁的牛,然后它们在第n年生下相同数量的小牛。(请用BorlandC++3.1或其他C++编译器)
#include<iostream.h>
#include<conio.h>
int cattle(int,int);
void main()
{
int ct,n;
cout<<"Please input the original cattle number:"<<endl; /*输入起始牛的数量*/
cin>>ct;
cout<<"Input how many years it past:"<<endl;
cin>>n;
cout<<"You have "<<cattle(ct,n)<<" cattle now!"<<endl;
getch();
}
int cattle(int ct,int n)
{
if(n<4) return (ct); /*停止条件*/
else
return (cattle(ct,n-1)+cattle(ct,n-3)); /*实现递归*/
}
怎么样,很简单吧。 会用循环求解吗?
递归在实际的编程中并不常用,但是在某些情况下,它是非常强有力而漂亮的工具。掌握它的原理时会十分有用的。
转自:
其它参考:
1、 http://www.nbrkb.net/lwt/jsjsj/sjjg&sf/c++dgyf.htm
2、 http://www.e-van.net/c-prog-hannuo.html
3、 http://www.cppblog.com/haosola/archive/2009/11/17/101163.aspx
4、 http://www.cnblogs.com/eslizn/archive/2011/05/29/2062043.html
5、 http://edu.3gmgc.com/tuwenjiaocheng/C__/diwuzhang_hanshuyuyuchuli/455.html
6、 http://www.asp119.com/program/ccc/2010-09-25/570.html
7、 http://comapp.ecjtu.jx.cn/view.php?id=45
8、 http://webservices.ctocio.com.cn/35/11398035.shtml
9、 http://www.gzu521.com/campus/article/it/200701/139273.htm
相关文章:

java导入excle表格,并且对表格进行相应的修改,并对表格数据进行整理,最后导出本地表格等一系列...
1.首先创建一个java项目 完成效果如下图所示 2.导入以下jar包 3.代码如下 其中行和列的操作是根据需求自动划分的 复制代码1 public class auto_date {2 private static List<List<String>> readExcel(File file) throws Exception {3 // 创建输入流,读…

RetinaFace,最强开源人脸检测算法
作者 | CV君 来源 | 我爱计算机视觉(ID:aicvmlaicvmlaicvml)人脸检测为目标检测的特例,是商业化最早的目标检测算法,也是目前几乎各大 CV 方向 AI 公司的必争之地。WIDER FACE 数据集是由香港中文大学发布的大型人脸数…

OpenCV中cvBlobsLib的编译与使用
OpenCV的cvBlobsLib库的作用类似于matlab中的regionprops函数。 cvBlobsLib库的编译: 首先从http://opencv.willowgarage.com/wiki/cvBlobsLib#Blobextractionlibrary下载最新的v8.3版本的源代码,其次机子上要装有OpenCV1.0的环境,从http:/…

AWS开源Firecracker,一种运行多租户容器服务的新虚拟化技术
现在的技术环境下,容器具有快速启动时间和高密度,VM可以对硬件虚拟化,具有更好的安全性,并对工作负载具有更好的隔离性。容器和VM的特性现在还不可兼得。 现在AWS开源了Firecracker,一种利用KVM的新虚拟化技术…

python urllib2 开启调试
2019独角兽企业重金招聘Python工程师标准>>> 发一段在网上看见. USING HTTPLIB.HTTPCONNECTION.SET_DEBUGLEVEL() WITH URLLIB2 Posted on October 1, 2007, 9:52 pm, by jamiegrove, under python. I’ve been trying to get the debug level turned on in urll…

从发展滞后到不断突破,NLP已成为AI又一燃爆点?
作者 | 刘家俊,一览群智CTO责编 | Jane出品 | AI科技大本营(ID :rgznai100)自然语言处理:人工智能连接主义复兴浪潮中的下一个突破口AI 行业应用是一片新的大陆,深度学习作为新大陆的基石,经历了…

matlab最小分类错误全局二值化算法
转自:http://download.csdn.net/detail/hupeng810/1511870 function imagBW kittlerMet(imag) % KITTLERMET binarizes a gray scale image imag into a binary image % Input: % imag: the gray scale image, with black foreground(0), and white % bac…

XShell连接Deepin
为什么80%的码农都做不了架构师?>>> 先让deepin安装openssh sudo apt-get install openssh-serverchkconfig ssh on 转载于:https://my.oschina.net/enzo/blog/110518

第三届“达观杯”文本智能信息抽取挑战赛丰厚奖金,群英集结,等你来战!...
近日,第三届“达观杯”文本智能信息抽取挑战赛正式上线启动(点击阅读原文,跳转报名页面),6月28日至8月31日,面向所有参赛选手开放竞赛结果提交。本届“达观杯”的任务是信息抽取。“达观杯”大赛由国内文本…

Spline interpolation and Savitzki-Golay smoothing
转自:http://octave.1599824.n4.nabble.com/Spline-interpolation-and-Savitzki-Golay-smoothing-td1675136.html ## natural-cubic-spline interpolation ## usage: yspline spline(x,y,xspline) ## example: ## x 0:10; y sin(x); ## xspline 0:0.1:10; y…

SpringBoot实现热部署(修改class不需要重启)
热部署: devtools可以实现页面热部署(即页面修改后会立即生效, 这个可以直接在application.properties文件中配置spring.thymeleaf.cachefalse来实现) 实现类文件热部署(类文件修改后不会立即生效),实现对属性文件的热部署。 注意:因为采用的虚拟机机制&…

Oracle中查看表空间的使用率的脚本
如题: select f.tablespace_name tablespace_name, round((d.sumbytes / 1024 / 1024 / 1024), 2) total_g, round(f.sumbytes / 1024 / 1024 / 1024, 2) free_g, round((d.sumbytes - f.sumbytes) / 1024 / 1024 / 1024, 2) used_g, round((d.sumbytes - f.sumbyte…

vue实现多个元素或多个组件之间动画效果
2019独角兽企业重金招聘Python工程师标准>>> 多个元素的过渡 <style>.v-enter,.v-leave-to{opacity: 0;}.v-enter-acitve,.v-leave-active{opacity: opacity 1s;} </style> <div idapp><transition><div v-ifshow>hello world</di…

干货 | 20个教程,掌握时间序列的特征分析(附代码)
作者 | Selva Prabhakaran 译者 | Tianyu责编 | Jane出品 | AI科技大本营(ID: rgznai100)【导语】时间序列是指以固定时间为间隔的序列值。本篇教程将教大家用 Python 对时间序列进行特征分析。1、什么是时间序列?时间序列是指以固定时间为间…

利用OpenCV求取图像的重心
转自:http://blog.csdn.net/lxiaoxiaot/article/details/6539834 不规则区域的矩,表示把一个归一化的灰度级图像函数理解为一个二维随机变量的概率密度。 这个随机变量的属性可以用统计特征--矩(Moments)来描述。通过假设非零的像…

C++中Ansi、Unicode、UTF8字符串之间的转换和写入
转自: http://dark0729.blogbus.com/logs/51496111.html Ansi字符串我们最熟悉,英文占一个字节,汉字2个字节,以一个\0结尾,常用于txt文本文件 Unicode字符串,每个字符(汉字、英文字母)都占2个字节,以2个连…

MyBatis的扩展点(plugins)
2019独角兽企业重金招聘Python工程师标准>>> 1、mybatis扩展点plugins mybatis的扩展是通过拦截器Interceptor来实现的,本质上就是JDK的动态代理,所以它只能对接口进行拦截,mybatis可以对以下四个接口类型进行拦截,也就…

linux中使用CST时间
GMT(Greenwich Mean Time,格林威治标准时间): 是指位于英国伦敦郊区的格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。 UTC(Universal Time/Temps Cordonn 世界标准时间)CST(Central Standard Time 國家標準時間,一說中原標…

到「黄埔学院」去:打造AI首席架构师,第二期限量招募!
今年 1 月,百度联合“深度学习技术及应用国家工程实验室”成立黄埔学院,旨在为产业培养第一批“首席AI架构师”。黄埔学院一期学员历时半年的学习和交流,6 月 16 日,黄埔学院一期学员迎来了毕业典礼,并在 7 月百度 AI开…

linux守护进程的创建
下面的完成了这样一个功能,创建一个守护进程,每个一秒在/tmp目录下的文件peng.txt中记录当前系统时间。 一、守护进程 守护进程是linux中的后台服务进程,在系统启动时开始运行,在系统关闭时终止。Linux系统中的大多数服务进程都是…

tesseract3.01的训练和使用
相关源码、资源下载:http://code.google.com/p/tesseract-ocr/downloads/list 训练步骤: 1、 Generate Training Images:生成tif图像文件(简单的几个汉字); 如:ABC.Roman.exp0.tif([lang].[fontname].exp[num].tif)…

旷视推出鼻纹识别,用AI寻找丢失宠物
来源 | 转载自旷视城市大脑(ID:MEGVII_CityBrain)导读:随着人工智能技术(AI)的大热,基于深度学习方法的人脸识别技术已成熟落地,在解锁、支付、认证、摄像等生活方方面面,各个大厂推…
Qt浅谈之一:内存泄露(总结)
一、简介 Qt内存管理机制:Qt 在内部能够维护对象的层次结构。对于可视元素,这种层次结构就是子组件与父组件的关系;对于非可视元素,则是一个对象与另一个对象的从属关系。在 Qt 中,在 Qt 中,删除父对…

LINUX新手入门-1.装系统
LINUX新手入门-1.装系统首先我们用虚拟机模拟 装linux系统,然后下一步下一步,然后完成后,编辑一些设置,把镜像放上面就可以了选第一项,安装系统,查看镜像是否能运行,直接跳过,选择语…

Log4cplus1.04的使用
首先,从http://sourceforge.net/projects/log4cplus/files/log4cplus-stable/下载最新的版本,解压缩,用vs2008打开msvc8文件夹下的log4cplus.sln,并按照提示转换。在Solution Configurations下拉列表框中,会有Debug、D…

FRVT赛程全纪录:格灵深瞳全球排名前五
作者 | 张德兵,格灵深瞳首席科学家&算法部负责人来源 | 转载自知乎张德兵最近两个月,格灵深瞳首席科学家&算法部负责人张德兵与算法团队参加了全球人脸识别算法测试(FRVT、Face Recognition Vendor Test)。虽然是第一次参加此比赛,格…

反转比特位(文章最后有干货)【转】
转自:https://blog.csdn.net/wuxianglonghaohao/article/details/21602305 http://www.newhottopic.com/2014/03/20/reverse-bits/ 把一个无符号整数的比特位反转顺序。有很多种方法来实现这个。我们这里给出一个算法:通过异或运算来交换,然后…

过关斩将打进Kaggle竞赛Top 0.3%,我是这样做的
作者 | Lavanya Shukla译者 | Monanfei责编 | 夕颜出品 | AI科技大本营(id:rgznai100)导读:刚开始接触数据竞赛时,我们可能会被一些高大上的技术吓到。各界大佬云集,各种技术令人眼花缭乱,新手们…

JavaBean规范
2019独角兽企业重金招聘Python工程师标准>>> (1)JavaBean 类必须是一个公共类,并将其访问属性设置为 public (2)JavaBean 类必须有一个空的构造函数:类中必须有一个不带参数的公用构造器&#x…

vigra1.8.0的使用
VIGRA stands for "Vision with Generic Algorithms". Its a novel computer vision library that puts its main emphasis oncustomizablealgorithms and data structures. 1、首先,从http://hci.iwr.uni-heidelberg.de/vigra/下载最新源代码࿰…