算法之递归

来源:互联网 发布:模拟器mac版 编辑:程序博客网 时间:2024/06/08 04:47

自从学了C语言,递归不得解。

自浅学习算法,递归得已解。

很多书上都这么写的,递归:就是间接调用自己或直接调用自己的过程叫递归。

话的确没错,初见还是较难理解,所以一般会给一个斐波那契数列什么的作为经典案例,不得不说我当初看的时候四个字:"头皮发麻"。

后来慢慢接触多了,也不觉得如何。

所谓递归:就是调用自己,不管是间接还是直接(一般都是直接调用)。递归也可以理解为循环,但是比循环占用空间大很多,代码简介是递归的特性,要想理解递归,光看是不行的,要自己动手推,最好是用笔推导过程。

下面我们来看一个案例:

#include <stdio.h>fun(int n){if(n==1)return 1;return fun(n-1)+n;}main(){int n=0;scanf("%d",&n);printf("%d\n",fun(n));}
这是一个求1+2+3+...+n的递归算法,用循环当然更简单,但这里我们讨论递归。

首先从键盘获取一个正整数n,比如我们输入的是5.

推导过程:

1.进入到fun函数中 ,第一步判断n(此刻n=5) == 1   假,此刻n=5,调用自己 fun(5-1)+5  //这里的n我用它本身的数替换了 

2.进入到fun函数中, 判断n(此刻n=4) == 1 假,此刻n=4,继续调用自己fun(4-1)+4 //把n替换成他本身的整数

3.进入fun函数中,判断n(此刻n=3)==1 还是假,此刻n=3 ,继续调用自己fun(3-1)+3//继续替换

4.进入fun函数中,判断n(此刻n=2)==1 还是假,此刻n=2,继续调用自己fun(2-1)+2//继续替换

5.重点来了,此时在判断n(此刻n=1)==1 为真 ,那么递归开始返回了,return 1返回了一个1

那么这个值就fun最后一次调用的值也就是编号为4fun(2-1)的值为1,fun(2-1)+2 相当于 1+2=3,返回3

那么fun函数的fun(3-1)+3,fun(3-1)的值就是3 ,即fun(3-1)+3的值为6

那么fun函数的fun(4-1)+4,fun(4-1)的值就是6 ,即fun(4-1)+4 =6+4 的值为10,返回10

那么fun函数的fun(5-1)+5,fun(5-1)的值就是10 ,即fun(5-1)+5的值为15

最后return 15 ,即结果=15


这是一个非常简单的过程,递归 ,递:传递(即调用自己),归:回归(return)。

再来回首看看这个题目,我们想知道1+...+5的结果是多少,那么我们首先要知道1+2的结果,知道1+2的结果了,(1+2)+3,知道(1+2)+3的结果了我们还需要知道(1+2+3)+4的结果,到这里子问题被依次求出 最后通过求出子问题结果 依次推出主问题结果即:递归 

这是个较简单的例子,但是如果推出来了,你理解递归会有一个长足的进步,如有不对,谢谢指出。