递归概念(2019-12-31)

递归的三大要素:

第一大要素明确你这个函数想要干什么:搞清楚这个弄函数功能是什么,用来完成什么事。

例如,我定义了一个函数

// 算 n 的阶乘(假设n不为0)

int f(int n){

}

第二要素:寻找递归结束条件

我们必须找出递归的结束条件,不然的话会一直调用自己。我们需找出当参数为什么时,递归结束,之后直接把结果返回。

// 算 n 的阶乘(假设n不为0)

int f(int n){

    if(n == 1){

        return 1;

    }

}

第三要素:找出函数的等价关系式

我们要不断缩小参数范围,缩小之后,可以通过一些辅助变量和唱歌操作,使原函数的结果不变

说白了就是找到一个等价关系式,f(n)的等价关系式子为n*f(n-1);

// 算 n 的阶乘(假设n不为0)

int f(int n){

    if(n <= 2){

        return n;

    }

    // 把 f(n) 的等价操作写进去

    return f(n-1) * n;

}

至此,递归三要素已经都写进代码里了,所以这个 f(n) 功能的内部代码我们已经写好了。

这就是递归最重要的三要素,每次做递归的时候,你就强迫自己试着去寻找这三个要素。

实例1:裴波那契数列

斐波那契数列的是这样一个数列:1、1、2、3、5、8、13、21、34....,即第一项 f(1) = 1,第二项 f(2) = 1.....,第 n 项目为 f(n) = f(n-1) + f(n-2)。求第 n 项的值是多少。

1,第一递归函数功能

假设f(n)的功能是求第n项的值,代码如下:

int f(int n) {

}

2,找出递归结束的条件

当n=1或n=2,我们可以知道结果f(1) = f(2) = 1.所以递归条件可以为n<=2.代码如下


int f(int n) {

    if(n<=2){

        return 1;

   }

}

第三要素:找出函数的等价关系式

题目已经把等价关系式给我们了,所以我们很容易就能够知道 f(n) = f(n-1) + f(n-2)。

最终代码如下:

int f(int n) {

//1,先写递归结束条件

if(n <= 2) {

    return 1;

}

2.接着写等价关系式

return f(n-1)+f(n-2);

}

实例2:小青蛙跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

1、第一递归函数功能

假设 f(n) 的功能是求青蛙跳上一个n级的台阶总共有多少种跳法,代码如下:

int f(int n){

}


2、找出递归结束的条件

求递归结束的条件,你直接把 n 压缩到很小很小就行了,因为 n 越小,我们就越容易直观着算出 f(n) 的多少,所以当 n = 1时, f(1) = 1。代码如下:

int f(int n){

    if(n == 1){

        return 1;

    }

}

第三要素:找出函数的等价关系式:

小青蛙可以跳一个台阶,也可以跳两个,也就是说有两种跳法

第一种跳法:第一次跳了一个台阶,那么还剩下n-1个台阶还没跳,剩下的n-1个台阶的跳法有f(n-1)种。

第二种跳法:第一次跳了两个台阶,那么还剩下n-2个台阶还没,剩下的n-2个台阶的跳法有f(n-2)种。

所以,小青蛙的全部跳法就是这两种跳法之和了,即 f(n) = f(n-1) + f(n-2)。

代码:int f(int n){

    if(n <=2){

        return n;

    }

    ruturn f(n-1) + f(n-2);

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容