【数据结构】43_递归的思想与应用 (上)

来旺
• 阅读 1632

递归是一种数学上分而自治的思想

  • 将原问题分解为规模较小的问题进行处理

    • 分解后的问题与原问题类型完全相同,但规模较小
    • 通过小规模问题的求解,能够轻易求得原问题的解
  • 问题的分解是有限的(递归不能无限进行)

    • 当边界条件不满足时,分解问题(递归继续进行)
    • 当边界条件满足时,直接求解(递归结束)

递归模型的一般表示法

【数据结构】43_递归的思想与应用 (上)

递归在程序设计中的应用

  • 递归函数

    • 函数体中存在自我调用的函数
    • 递归函数必须有递归出口(边界条件)
    • 函数的无限递归将导致程序崩溃

递归思想的应用

求和 Sum

Sum(n) = 1 + 2 + 3 + ... + n

【数据结构】43_递归的思想与应用 (上)

编程实现:递归求和

#include <iostream>

using namespace std;

unsigned int sum(unsigned int n)
{
    if (n > 1)
    {
        return n + sum(n - 1);
    }

    return 1;
}

int main()
{
    cout << sum(100) << endl;

    return 0;
}

输出:

5050

斐波那契数列

数列自身递归定义:1,1,2,3,8,13,21,...

【数据结构】43_递归的思想与应用 (上)

编程实验:斐波那契数列

#include <iostream>

using namespace std;

unsigned int fibonacci(unsigned int n)
{
    if (n > 2)
    {
        return fibonacci(n-1) + fibonacci(n-2);
    }

    return 1;
}

int main()
{
    for (unsigned int i=1; i<=10; ++i)
    {
        cout << fibonacci(i) << endl;
    }

    return 0;
}

输出:

1
1
2
3
5
8
13
21
34
55

求解字符串长度

【数据结构】43_递归的思想与应用 (上)

编程实验:求解字符串长度

#include <iostream>

using namespace std;

unsigned int _strlen_(const char *s)
{
//    if (*s != '\0')
//    {
//        return 1 + _strlen_(s + 1);
//    }

//    return 0;

    return (s ? (*s ? (1+_strlen_(s+1)) : 0) : 0);
}

int main()
{
    cout << _strlen_("D.T.") << endl;

    return 0;
}

输出:

4

小结

  • 递归是一种将问题分而自治的思想
  • 用递归解决问题首先要建立递归的模型
  • 递归解法必须要有边界条件,否则无解
  • 不要陷入递归函数的执行细节,学会通过代码描述递归问题

以上内容整理于狄泰软件学院系列课程,请大家保护原创!

点赞
收藏
评论区
推荐文章
凯特林 凯特林
4年前
浅谈JS中的递归
一、递归递归(英语:Recursion)在数学与计算机科学中,是指在函数的定义中使用函数自身的方法在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数其核心思想是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解一般来说,递归需要有边界条件、递归前进阶段和递归返回阶段。当边界条件不满足时,递归前进;当边界条件满
徐小夕 徐小夕
4年前
如何优雅的使用javascript递归画一棵结构树
递归和尾递归简单的说,递归就是函数自己调用自己,它做为一种算法在程序设计语言中广泛应用。其核心思想是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的
Wesley13 Wesley13
3年前
PHP安全性防范方式
<h2SQL注入</h2<pSQL注入是一种恶意攻击,用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行。</p<h4防范方式</h4<ul<li使用mysql\_real\_escape\_string(),或者addslashes()过滤数据</li<li手动检查每一数据是否为正确的数据类型</li<li使用
Wesley13 Wesley13
3年前
Activiti 工作流入门指南
<divclass"htmledit\_views"id"content\_views"<h1<aname"t0"</a概览</h1<p如我们的介绍部分所述,Activiti目前分为两大类:</p<ul<li<p<ahref"https://activiti.gitbook.io/activiti7deve
Stella981 Stella981
3年前
ASMSupport教程4.8 生成逻辑运算操作
<p在java中有以下逻辑运算符:</p<ul<li&amp;&amp;:条件与</li<li||:条件或</li<li&amp;:布尔型的逻辑与</li<li|:布尔型的逻辑或</li<li^:布尔型的逻辑异或</li<li!:非操作</li</ul<p那么接下来我们将些段例子
Wesley13 Wesley13
3年前
mysql 5.7 windows zip安装
<ol<limysql官网下载windowszip安装包并解压(D:wampmysql56winx64)</li<li添加pathD:wampmysql5722winx64bin</li<li创建data目录D:\\wamp\\mysql56winx64\\data</li<li<p创建mysql配置文
Stella981 Stella981
3年前
ASMSupport教程4.11 生成数组操作
<p在任何语言里,数组都是基本的数据类型,我们这一节将讲述如何生成数组操作。</p<p数组操作包括以下几个:</p<ol<li创建数组</li<li获取数组长度</li<li获取数组每个元素的内容</li<li为数组元素赋值</li</ol<p我们接下来对每种操作进行详解。</p<h3<fonts
Stella981 Stella981
3年前
IdeaVim
<divid"cnblogs\_post\_body"class"blogpostbodycnblogsmarkdown"<h3id"ideavim简介"IdeaVim简介</h3<pIdeaVim是IntelliJIDEA的一款插件,他提高了我们写代码的速度,对代码的跳转,查找也很友好。</p<ul<li安装位置</
Stella981 Stella981
3年前
ASMSupport教程4.12 生成方法调用操作
<p这一节我们讲如何用ASMSupport生成方法调用的操作,方法调用包括下面四种类型:</p<ol<li调用构造方法<li调用静态方法<li调用非静态方法<li调用当前类的方法<li调用父类方法</li</ol<p首先我们需要看我们想要生成的类:</p<p代码1:</p<h3<divid"scid:9D
Wesley13 Wesley13
3年前
HTML快捷写法大全
父子用\ \Ulli\3\<ul\    <li\</li\    <li\</li\    <li\</li\</ul\兄弟之间用,也可以省写\pspan\,\ul\<p\</p\<span
时间复杂度为 O(nlogn) 的排序算法 | 京东物流技术团队
归并排序归并排序遵循分治的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来建立原问题的解,归并排序的步骤如下:划分:分解待排序的n个元素的序列成各具n/2个元素的两个子序列,将长数组的排序问题转换为短数
来旺
来旺
Lv1
举杯邀明月,对影成三人。
文章
3
粉丝
0
获赞
0