递归。

是的,差不多就是这种感觉。上面就是类似递归的显示表现。

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语言_递归的更多相关文章

  1. 温故而知新_C语言_前缀++(--)和后缀++(--)

    前缀++(--)和后缀++(++)是有区别的. 再单独使用的时候是没有区别的,都是自身递增或者递减1. 但是综合使用起来会一样吗? 下面的例子都是++,替换成--也是一样,道理都是一样的. 请先看下面 ...

  2. 选择排序_C语言_数组

    选择排序_C语言_数组 #include <stdio.h> void select_sort(int *); int main(int argc, const char * argv[] ...

  3. 插入排序_C语言_数组

    插入排序_C语言_数组 #include <stdio.h> void insertSort(int *); int main(int argc, const char * argv[]) ...

  4. 快速排序_C语言_数组

    快速排序_C语言_数组 #include <stdio.h> void quickSort(int *, int, int); int searchPos(int *, int, int) ...

  5. 冒泡排序_C语言_数组

    冒泡排序_C语言_数组 #include <stdio.h> //冒泡排序 小->大 void sort(int * pArray, int len); int main(int a ...

  6. 温故而知新_C语言_define_宏

                                                                                             define defi ...

  7. 数据结构_C语言_二叉树先序、中序、后序遍历

    # include <stdio.h> # include <stdlib.h> typedef struct BiTreeNode { char data; struct B ...

  8. 数据结构_C语言_单链表

    # include <stdio.h> # include <stdbool.h> # include <malloc.h> typedef int DataTyp ...

  9. 【书籍下载链接】_1_第一轮_C语言书籍

    各位朋友,如果您觉得下载的电子书,看的还可以,请购买纸质版的图书,如果您觉得 您下载的书,不值得一看请在下载后直接删除. Windows汇编:http://dl.vmall.com/c0jk1v970 ...

随机推荐

  1. Extjs5.0 学习之路【结构篇】

    Extjs5.0在原有的MVC模式下增加了一个MVVM Extjs5.0项目文件执行顺序. 新增特性一  bind---data

  2. 机器学习:调整kNN的超参数

    一.评测标准 模型的测评标准:分类的准确度(accuracy): 预测准确度 = 预测成功的样本个数/预测数据集样本总数: 二.超参数 超参数:运行机器学习算法前需要指定的参数: kNN算法中的超参数 ...

  3. Windows:cmd的使用

    1.如果在cmd.exe中无法运行软件(如python),因为在系统的环境变量中,path中没有该软件的安装路径: 2.通过pip安装软件:pip install 文件路径\文件全名,将软件安装在指定 ...

  4. Python 正则表达式取值

    import re class Retest: def __init__(self,string,path): self.string = string self.path = path def re ...

  5. 西安电子科技大学第16届程序设计竞赛 F Operating System (unique() 去重函数)

    链接:https://www.nowcoder.com/acm/contest/107/F来源:牛客网 Operating System 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ ...

  6. 解决webpack因新版本打包失败问题--ERROR in multi ./src/main.js ./dist/bundle.js

    最近在学习webpack打包过程中遇到的一个问题向大家分享下! 创建了一个webpacksty的目录,目录下放着dist,src子目录,然后通过node环境下,npm init -y 初始化项目出现p ...

  7. Git学习笔记(二)分支管理与合并及Bug分支

    一.分支管理 1.什么是分支 分支就相当于我们看科幻片里的平行宇宙,如果两个平行宇宙互不干扰,那铁定是啥事儿没有.不过,在某个时间点,两个平行宇宙合并了呢?假如两个宇宙中都有你的影子, 合并之后相当于 ...

  8. 数据库学习笔记(二)MySQL数据库进阶

    MySQL 进阶 关于连表 左右连表: join 上下连表: union #自动去重 (当两张表里的数据,有重复的才会自动去重) union all #不去重 #上下连表示例: select sid, ...

  9. Linux常用的编辑保存退出命令

    Vi Vim进入编辑后退出 按ESC后 1.保存退出 :wq :x 最快捷的方法:直接按shift+zz,或者切换到大写模式按ZZ,就可以保存退出了,即是按2下大写的Z.区别::wq 强制性写入文件并 ...

  10. spring的配置文件在web.xml中加载的方式

    web.xml加载spring配置文件的方式主要依据该配置文件的名称和存放的位置不同来区别,目前主要有两种方式. 1.如果spring配置文件的名称为applicationContext.xml,并且 ...