温故而知新_C语言_递归
递归。
是的,差不多就是这种感觉。上面就是类似递归的显示表现。
2017 10 24更新:
递归这个问题放了很久。也没有写。大概是自己还没有好好理解吧。
在这里写下自己理解的全部。
一 何为递归。
字面意义,分开看。 有传递。有回归。或者归还。
浅显的理解就是调用自己。
那么递归可以调用自己,肯定是有一些约束的条件。 不然就会无限次的调用自己。这个很好理解吧?
说一个小示例来讲解一下何为递归。
一个房子里面有一个男人在玩着一个房子模型,房子模型里面还有一个房子,房子里面有一个男人,男人在玩着一个房子模型,房子模型里面有一个男人,男人在玩着一个房子模型....
从前有一个座山,山上有一座庙,庙里有个老和尚,老和尚再给小和尚讲故事,故事是从前有一个座山,山上有一座庙,庙里有一个老和尚,老和尚再给小和尚讲故事,故事是从前有一座山...
这就是递归了。
OK,讲了这么多,那么如何写呢?
其实写递归还好,最重要的是理解递归。
例子:
int fu(int n)
{
if(n==)
return ; //递归出口
else
return n*fu(n-); //递归 }
二: 递归出口
刚才讲递归是要约束的,那么递归的约束就是递归出口。
递归出口是什么呢?
你想想啊,刚才我举了两个例子,房子和老和尚。如果没有出口是不是就无限递归了。
我们使用递归,不是为了无限递归了。没什么用了啊!
所以要有一个出口,也就是递归的限制。
三 递归使用
递归的本质和循环差不多的。递归能干的事情,循环也能干。
那么为什么递归还要存在呢,因为短小精悍。
OK,那么什么情况下会用到递归呢? 你需要写一个函数,函数的内容都很单一(就是处理一个事物),能用循环解决的。这些都可以用递归来解决。
那么示例1:
阶乘
int fu(int n)
{
if(n==)
return ; //递归出口
else
return n*fu(n-); //递归 }
嗯,这就是一个阶乘递归。
阶乘是什么呢?
1! =1*1
2!=2*1
3!=3*2*1
4!=4*3*2*1
5!=5*4*3*2*1
就是这个数乘上这个数以前所有的数。
那么如何理解这个阶乘算法呢?
比如说求5的阶乘。
5的阶乘是不是5*4的阶乘
4的阶乘是不是4*3的阶乘
3的阶乘是不是3*2的阶乘
2的阶乘是不2*1的阶乘
1的阶乘是不是1
看见没,求5的阶乘你必须先回到到1的阶乘,一步一步向上计算才能算到5的阶乘。这一个过程就是递归。
递归的过程是:递到1,归回5.
让我们看一下流程图。
上面的图不太标准,如果有在学习算法的话,理解一下栈,可以对递归的理解有一定的帮助。
四 递归的理解。
递归呢,很好用,但是呢也有一定的缺陷,比如时间的复杂度啊,很浪费空间啊。
但是在代码上确实很简短。
说起来还是要理解你要处理的事物,对这个事物的算法有一定要深度理解。
要能推算出能够递归的算法。 就如比说上面的乘阶。 很明显就能看出来是个递归的算法。
符合递归的算法是什么?
说实话 我也不是会很多。但是呢 肯定有一个特点。
可以推算到最底部,或者最开始的部分。
然后呢在沿着向上可以算出最顶部的部分。
我理解的递归就是如此了。
温故而知新_C语言_递归的更多相关文章
- 温故而知新_C语言_前缀++(--)和后缀++(--)
前缀++(--)和后缀++(++)是有区别的. 再单独使用的时候是没有区别的,都是自身递增或者递减1. 但是综合使用起来会一样吗? 下面的例子都是++,替换成--也是一样,道理都是一样的. 请先看下面 ...
- 选择排序_C语言_数组
选择排序_C语言_数组 #include <stdio.h> void select_sort(int *); int main(int argc, const char * argv[] ...
- 插入排序_C语言_数组
插入排序_C语言_数组 #include <stdio.h> void insertSort(int *); int main(int argc, const char * argv[]) ...
- 快速排序_C语言_数组
快速排序_C语言_数组 #include <stdio.h> void quickSort(int *, int, int); int searchPos(int *, int, int) ...
- 冒泡排序_C语言_数组
冒泡排序_C语言_数组 #include <stdio.h> //冒泡排序 小->大 void sort(int * pArray, int len); int main(int a ...
- 温故而知新_C语言_define_宏
define defi ...
- 数据结构_C语言_二叉树先序、中序、后序遍历
# include <stdio.h> # include <stdlib.h> typedef struct BiTreeNode { char data; struct B ...
- 数据结构_C语言_单链表
# include <stdio.h> # include <stdbool.h> # include <malloc.h> typedef int DataTyp ...
- 【书籍下载链接】_1_第一轮_C语言书籍
各位朋友,如果您觉得下载的电子书,看的还可以,请购买纸质版的图书,如果您觉得 您下载的书,不值得一看请在下载后直接删除. Windows汇编:http://dl.vmall.com/c0jk1v970 ...
随机推荐
- 把ASM下的HDD VM转换成ARM下Managed Disk的SSD VM
在ASM下,要把HDD的VM转换成SSD的VM步骤非常复杂.需要手工把Disk从普通存储账户复制到高级存储账户.再通过这个Disk创建VM. 目前在有了ASM到ARM的迁移工具,以及Managed D ...
- 蓝桥杯 历届试题 PREV-3 带分数
历届试题 带分数 时间限制:1.0s 内存限制:256.0MB 问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3 ...
- jsp 的url传参中文乱码问题解决办法
在js文件中,使用连接jsp的url传参,如果参数是中文会出现乱码问题,如下可以解决: 方法一:(已确认 可行) String username = new String(request.getPar ...
- webrtc doubango linphone
1.doubango官网:http://www.doubango.org/ 2.doubango是一个开源的VOIP基础平台, 并能用于嵌入式和桌面系统的开源框架,该框架使用ANSCI-C编写,具有很 ...
- Java中实现MongoDB自增主键ID
1.了解MongoDB的ObjectId MongoDB的文档固定是使用“_id”作为主键的,它可以是任何类型的,默认是个ObjectId对象(在Java中则表现为字符串),那么为什么M ...
- 实现MVC
为什么需要MVC? 1.代码规模越来越大,切分职责是大势所趋: 2.为了复用:很多逻辑是一模一样的: 3.为了后期维护方便:修改一块功能不影响其他功能 MVC只是手段,最终目的是模块化和复用 Cont ...
- 虚幻引擎4设置Visual Studio
转自:http://www.unrealchina.net/portal.php?mod=view&aid=149 设置Visual Studio和虚幻引擎4协同工作有利于提高开发人员使用UE ...
- 11-16网页基础--HTML
网页制作部分主要讲解三大部分: 1.HTML 超文本标记语言( 全称:Hyper Text Markup Language) 专门编辑静态网页 2.CSS 网页美化:是HTML控制的 ...
- 问题:asp.net 点击button按钮调到页面顶部;结果:asp.net点击一个按钮,使页面跳转到本面页上的指定位置
asp.net点击一个按钮,使页面跳转到本面页上的指定位置 (2011-04-19 16:46:51) 转载▼ 标签: it 最近在做一个项目. 用到标题所说的功能. 实现方法: 1.在aspx中 ...
- ListView---复杂的listview显示
1 . 初始化数据 private void fillData() { ll_loading.setVisibility(View.VISIBLE); // 显示进度 new Thread() { p ...