c++2(循环和递归)
其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容。当然,如果循环还好理解一点,那么递归却没有那么简单。我们曾经对递归讳莫如深,但是我想告诉大家的是,递归其实没有那么可怕。所谓的递归就是函数自己调用自己而已,循环本质上也是一种递归。
1)求和递归函数
我们可以举一个循环的例子,前面我们说过,如果编写一个1到n的求和函数怎么写呢,你可能会这么写:
int calculate(int m)
{
int count = 0;
if(m <0)
return -1; for(int index = 0; index <= m; index++)
count += index; return count;
}
上面只是一个示范。下面我们看看如果是递归应该怎么写呢?
int calculate(int m)
{
if(m == 0)
return 0;
else
return calculate(m -1) + m;
}
大家看着两段代码有什么不同?
(1)第一段代码从0,开始计算,从0到m逐步计算;第二段代码是从10开始计算,逐步到0之后这回,这样同样可以达到计算的效果
(2)第一段代码不需要重复的压栈操作,第二段需要重复的函数操作,当然这也是递归的本质
(3)第一段代码比较长,第二段代码较短
2)查找递归函数
大家可能说,这些代码有些特殊。如果是查找类的函数,有没有可能修改成递归函数呢?
int find(int array[], int length, int value)
{
int index = 0;
if(NULL == array || 0 == length)
return -1; for(; index < length; index++)
{
if(value == array[index])
return index;
} return -1;
}
大家可能说,这样的代码可能修改成这样的代码:
int _find(int index, int array[], int length, int value)
{
if(index == length)
return -1; if(value == array[index])
return index; return _find(index + 1, array, length, value);
} int find(int array[], int length, int value)
{
if(NULL == array || length == 0)
return -1; return _find(0, array, length, value);
}
3) 指针变量遍历
结构指针是我们喜欢的遍历结构,试想如果有下面定义的数据结构:
typedef struct _NODE
{
int data;
struct _NODE* next;
}NODE;
那么,此时我们需要对一个节点链接中的所有数据进行打印,应该怎么办呢?大家可以自己先想想,然后看看我们写的代码对不对。
void print(const NODE* pNode)
{
if(NULL == pNode)
return; while(pNode){
printf("%d\n", pNode->data);
pNode = pNode->next;
}
}
那么此时如果改成递归,那就更简单了:
void print(const NODE* pNode)
{
if(NULL == pNode)
return;
else
printf("%d\n", pNode->data); print(pNode->next);
}
其实,写这么多,就是想和大家分享一下我个人的观点:循环是一种特殊的递归,只有递归和堆栈是等价的。所有的递归代码都可以写成堆栈的形式,下面的一片博客我们就讨论一下堆栈和递归的关系。要想写好,必须熟练掌握堆栈。
c++2(循环和递归)的更多相关文章
- Atitit 循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate).
Atitit 循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 1.1. 循环算是最基础的概念, 凡是重复执行一段代码, 都可以称之为循环. ...
- codevs http://www.codevs.cn/problem/?problemset_id=1 循环、递归、stl复习题
12.10高一练习题 1.要求: 这周回顾复习的内容是循环.递归.stl. 不要因为题目简单就放弃不做,现在就是练习基础. 2.练习题: (1)循环 题目解析与代码见随笔分类 NOI题库 htt ...
- 循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate)的区别
表示“重复”这个含义的词有很多, 比如循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 循环算是最基础的概念, 凡是重复执行一段代码, 都可以称 ...
- 求1+2+…+n,要求不能使用乘除法、for、while、if、else、s witch、case 等关键字以及条件判断语句(A?B:C)和不用循环/goto/递归输出1~100的10种写法
来源:据说是某一年某个公司的面试题 题目:求1+2+…+n, 要求不能使用乘除法.for.while.if.else.s witch.case 等关键字以及条件判断语句(A?B:C) 分析:这题本来很 ...
- leetcode 326. Power of Three(不用循环或递归)
leetcode 326. Power of Three(不用循环或递归) Given an integer, write a function to determine if it is a pow ...
- C#统计给定的文本中字符出现的次数,使用循环和递归两种方法
前几天看了一个.net程序员面试题目,题目是”统计给定的文本中字符出现的次数,使用循环和递归两种方法“. 下面是我对这个题目的解法: 1.使用循环: /// <summary> /// 使 ...
- 003_循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate)的区别
表示“重复”这个含义的词有很多, 比如循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 循环算是最基础的概念, 凡是重复执行一段代码, 都可以称 ...
- [Effective JavaScript 笔记]第64条:对异步循环使用递归
假设需要有这样一个函数,接收一个URL的数组并尝试依次下载每个文件直到有一个文件被成功下载.如果API是同步的,使用循环很简单实现. function downloadOneSync(urls){ f ...
- 《Algorithms Unlocked》读书笔记1——循环和递归
<Algorithms Unlocked>是 <算法导论>的合著者之一 Thomas H. Cormen 写的一本算法基础. 书中没有涉及编程语言,直接用文字描述算法,我用 J ...
随机推荐
- linux下制作镜像文件
第一:制作iso镜像的方法: 把/dev/cdrom目录制作为镜像,名字为/root/rh1.iso 方法1:dd if=/dev/cdrom of=/root/rh1.iso 方法2:#cat /d ...
- vue入坑总结
1.Do not mount Vue to <html> or <body> - mount to normal elements instead. Vue2.x之后不推荐挂载 ...
- java 操作本地数据库 mysql
单线程版 /** * */ import java.sql.*; import java.util.Date; import org.omg.CORBA.PUBLIC_MEMBER; /** * @a ...
- Oracle学习笔记_06_CASE WHEN 用法介绍
1. CASE WHEN 表达式有两种形式 --简单Case函数 CASE sex ' THEN '男' ' THEN '女' ELSE '其他' END --Case搜索函数 CASE ' THEN ...
- 使用trim_galore软件遇到的问题
我的原始测序数据是双端测序,在用trim_galore软件去接头的这一步,使用的命令行是 time nohup trim_galore R17002628-SKOV3-m6A_combined_R1. ...
- Fiddler中设置断点修改Request和Response
Fiddler中设置断点修改Request Fiddler最强大的功能莫过于设置断点了,设置好断点后,你可以修改httpRequest 的任何信息包括host, cookie或者表单中的数据.设置断点 ...
- postfix : 452 4.3.1 Insufficient system storage
postfix Error Message: 452 4.3.1 Insufficient system storage --> 空间不足. 但是实际情况是我的各个分区都没有满,只是我的20G ...
- 【Java框架型项目从入门到装逼】第八节 - 用EasyUI绘制主界面
1.引入资源包 在上一节中,我们把基本的框架都搭好了,用了Spring,SPringMVC.这一节,我们先来画页面,前端框架采用EasyUI来实现. easyui是一种基于jQuery的用户界面插件集 ...
- 用JAVA写一个冒泡排序
一:实现思想: 基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要 ...
- DAY2-java对你有点好感2018-1-10
第二天,对你有好感,还是不想复习,继续学习!! 第一天:归在日记分类,不能改为随笔,无奈/ 链接http://www.cnblogs.com/archer-lcy/diary/2018/01/09/8 ...