【算法】学习笔记(2):递归思想

0 回顾

之前的笔记(0)和笔记(1),我们介绍了算法的基本含义,并且举了一些实例,同时理解了,算法就是人类在教计算机做事情!

我们知道,算法就是解决问题的方案,我们将自然语言描述的问题,转换为符号语言,再解决问题,使用计算机思维,构建解决问题的算法,最后转换为计算机可以识别的语言,教会计算机,让它帮助我们解决问题。

在算法设计的时候,我们需要关注其时间和空间的复杂度,这与实际问题有关,可能关注事件,也可能关注空间,也可能二者兼有。

下面,我们来看看递归思想,并且使用实例来理解抽象的思想。

1 递归思想

递归是可能计算机与人类最大的不同,人类是递推思维,能够发散,计算机是递归思维,能够做重复且简单的固定事情。

因此,我们教计算机做事的时候,要尽可能简单且固定,也就是,我们需要将一个复杂的问题,拆解成若干小问题,这些小问题最好还是已知的,已经被解决的,这样,我们就很容易能够设计出一个算法,并且教会计算机做事。

1.1 递归的含义

所谓的递归,看起来就像:同样的一件事情,做了很多遍,虽然每一次的代码一样,但是每一次的数据不一样,导致行为不一样,并且,会有一个尽头,一旦走到尽头了,就得原路返回来。

我们看一个例子
在这里插入图片描述

#include <iostream>
using namespace std;void story(int i) {if (i > 10)return;cout << "从前有个庙,庙里有个老和尚,老和尚给小和尚讲故事" << endl;cout << "讲的故事是什么呢?讲的是:" << endl;story(i + 1);
}int main()
{story(1);return 0;
}

这就是生活中的一个递归的例子,还蛮有趣的!

注意,它并不是循环!与循环还是有差别的,最重要的就是,递归在条件终止之后,会返回来,而循环,条件终止就停了。

1.2 递归算法的重要结构

  1. 终止条件 & 终止处理办法
  2. 递归处理方法

在这里插入图片描述

我们知道,递归不可能无限进行下去,因此需要终止条件,以及触发该条件后对应的处理方案。

并且,更重要的是,我们需要知道递归如何处理

对于递归程序,通常都是解决一个小问题

我们将一个大问题分解成若干个小问题,然后,这些小问题的处理方式是相似的,我们用递归来分别解决每一个小问题,得到每个小问题的解,之后将这些解合并。

阶乘问题

在这里插入图片描述
先列出递归方程,再转换为程序即可。

// 阶乘问题
int factorial(int n) {if (n <= 0)return 1;elsereturn n * factorial(n - 1);
}

如果不用递归呢?

使用递推! 从1到n.用循环搞定。

// 不用recursion的阶乘,递推
int factorial2(int n) {if (n == 0)return 1;int result = 1;for (int i = 1; i <= n; i++) {result *= i;}return result;
}

递归特点:有去有回!从n到1!从结果到起点,再返回来。

对于递归来说,最开始目标的n就是已知的,然后逐渐变化到临界值,经过层层处理,再返回来。关键点:递归方程!

斐波那契数列

递归方程

  1. f(n) = 1,n = 1或n = 0
  2. f(n) = f(n-1) + f(n-2),n > 1
// 斐波那契数列
int fib(int n) {if (n == 1 || n == 0)return 1;return fib(n - 1) + fib(n - 2);
}

在这里插入图片描述
迭代:就是重复执行一些指令,指令是一定的,但是相关的数据是变化的。

递归调用的过程,终点参数在不断变化,一直在逼近终点,最终停下来,依次返回。

小结

我们先将一个问题,使用符号语言描述,拆解问题,将其转换成递归方程,使用数学语言描述,然后将其转换为算法和实际的程序。

所谓的递归,就是先给出终点参数,它是复杂的,然后随着参数的减小,会逐渐简单,然后得到最简单的结果,之后再往回走,就能获得复杂问题的结果。

这与人类思维不一样,人类通常是递推,先解决简单问题,再逐渐复杂化,最终解决复杂问题。

因此,求解问题的时候,可以简单问题找规律,最终获得复杂抽象的方程,从而获得最终结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机系统设计】实践笔记(5)改进数据通路:beq和bne指令分析与实现

接下来的分析和实践非常粗糙&#xff0c;因为跟之前一样的分析流程&#xff0c;不再多说了&#xff0c;如果前面真的掌握&#xff0c;这里不看也罢。 分析 先看beq指令。 ALU输入的是rs和rt&#xff0c;不输入imm&#xff0c;进行subu操作&#xff0c;判断是否为zero&#x…

【算法】学习笔记(4):分治思想 归并排序

分治思想&#xff0c;分治策略&#xff0c;自古有之&#xff0c;与人类生活息息相关&#xff0c;其本质是将大问题拆解为小问题&#xff0c;小问题转换为已知解的问题&#xff0c;进而求解。 军队管理&#xff0c;国家分级治理…… 大规模数据排序&#xff0c;例如10000000000…

html css 学习笔记(1)背景相关

背景颜色 图片 插入图片img背景图片 背景图片 3. logo 4. 大图 5. 装饰性小图 便于控制位置&#xff01; 插入后会执行自动平铺&#xff0c;这与插入图片是不同的&#xff01; div{width: 600px;height: 300px;background-image: url(img/登录用户头像.png); }小结 盒子的第…

2020-12-15 CPU设计复盘

SOC修改 将之前完成的31条指令单周期CPU进行了重构&#xff0c;将其分开&#xff0c;实现了内外有别&#xff0c;将CPU、指令ROM和数据RAM。 这样&#xff0c;以后为其增加接口外设&#xff0c;总线控制&#xff0c;才更加清晰&#xff0c;这是进一步封装和抽象。 MARS大坑 …

Tomcat 学习笔记(0)

JavaWeb 用Java写的程序&#xff0c;可以在浏览器运行。 Request & Responce Web资源 Web服务器 我们在自己的主机启动Tomcat服务器&#xff0c;然后运行它&#xff0c;就能够通过主机访问这个服务器&#xff0c;这个服务器能够运行我们的程序。 部署Web工程 法1 将web…

计算机系统 学习笔记(0)南京大学(一)第一周

课程&#xff1a;计算机系统基础 核心理念&#xff1a;人类世界与计算机世界的异同 人类世界 直观感受数学 计算机世界 与数学不同&#xff0c;存储首先&#xff0c;各层次与现实世界不同 我们关注点是差异点&#xff01; 一样的你就不用关心了&#xff0c;关心差异&#…

x86架构下 CF与OF标志位 带符号和无符号运算 详解

针对能够影响OF和CF标志位的指令&#xff0c;一般来说是涉及到数据运算的指令&#xff0c;这里使用add举例&#xff0c;即不区分有无符号的加法指令&#xff0c;参与运算的数据&#xff0c;从二进制层级去考虑。 CF标志位 对于CF&#xff0c;它是carry flag&#xff0c;进位标…

tmux学习笔记

参考学习链接 我们需要理解几个重要的概念 session 回话window 窗口pane 窗格 window 我们打开的一个terminal就是一个window. 而打开的这个window&#xff0c;也就是打开了一个session&#xff0c;打开window&#xff0c;session开始&#xff1b;关闭window&#xff0c;se…

Linux的ext4文件系统学习笔记

补充&#xff1a;设备独立性 Linux中&#xff0c;设备驱动以文件形式表示&#xff0c;用户操作逻辑设备就是操作文件&#xff0c;而不是具体的物理设备&#xff0c;也就是说&#xff0c;用户操作的是功能&#xff0c;是黑箱&#xff0c;而不是真正的实体。 APP操作的都是逻辑…

html基础元素案例笔记(1)

这是代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>CSS FlexBox test</title><link rel"stylesheet" type"text/css" href"./css/index.css"></head><body>…

C语言中的struct和union区别

参考&#xff1a;Difference between Structure and Union in C 二者区别 struct 这里不做详细说明&#xff0c;因为参考链接中都写明了。只做一些重点强调。 struct中声明的变量&#xff0c;在分配空间的时候&#xff0c;struct结构空间大小&#xff0c;大于等于其内部所有…

Leetcode1512. 好数对的数目 抽出本质原型 利用范围条件

解法1&#xff1a;暴力枚举 class Solution {public int numIdenticalPairs(int[] nums) {int count 0;for(int i 0;i < nums.length; i){for(int j i 1; j < nums.length; j){if(nums[i] nums[j])count;}}return count;} }没啥可说的&#xff0c;就是小学数学问题…

leetcode面试题 10.01. 合并排序的数组

直接排序 直接使用Java已有的方法进行排序&#xff0c;这一招…大意了&#xff01; 这题简单&#xff0c;就是个基本的排序&#xff0c;后面难题&#xff0c;可能这只是一小步&#xff0c;内个时候直接用排序算法比较合适&#xff0c;这个不合适。。 class Solution {public…

IA-32 Architecture: the function of segment regitster(CS DS SS ES)

对于IA-32架构&#xff0c;与8086不同&#xff0c;段寄存器不再是像以前一样&#xff0c;直接作为段基址&#xff0c;因为32位的寄存器直接就可以表示4GB大小&#xff0c;不需要再偏移&#xff0c;因此段寄存器的含义也发生了相应的变化。 在IA-32架构里&#xff0c;段寄存器是…

x86异常处理与中断机制(1)概述中断的来源和处理方式

参考《计算机组成》&#xff08;北京大学 MOOC&#xff09; 1 异常与中断的来源&#xff08;为什么需要中断&#xff09; 首先&#xff0c;说明一下异常和中断这两个概念。 它们两个唯一的区别&#xff0c;就是&#xff0c;没有什么区别。只是不同的地方不同的时间不同的人的…

【C language】动态数组的创建和使用

在C语言中&#xff0c;使用malloc函数创建动态数组&#xff0c;使用一个指针指向它&#xff0c;使用下标进行访问。 unsigned long *a (unsigned long *)malloc(2 * sizeof(int)); a[0] 1000; a[1] 2000; printf("%d %d\n", a[0], a[1]); free(a);上述例子&…

x86异常处理与中断机制(2)中断向量表

补充&#xff1a;事件不仅包含中断和异常&#xff0c;还包含系统调用&#xff0c;这个属于用户主动请求的事件。 上一节&#xff0c;只有一个溢出异常&#xff0c;那么&#xff0c;如果很多异常、中断呢&#xff1f;&#xff08;中断向量表&#xff09; 另外&#xff0c;之前0…

x86异常处理与中断机制(3)中断处理过程

上一节讲完了根据中断类型号找中断服务程序的过程&#xff0c;现在着重说明一下更加完整的中断处理过程吧。 本节以8086时代的中断处理过程为例进行说明&#xff0c;主要分两大部分 硬件处理软件处理 需要注意&#xff0c;这不是绝对的&#xff0c;得看实际情况&#xff0c;…

Linux 0.11 内核解析:中断相关(1)asm.s文件中断处理分析

0 源代码 有两个版本的&#xff0c;一个是带中文注释&#xff0c;Intel格式的&#xff1b;一个是不带注释是AT&T格式的。 Linux 0.11 中文注释版 Linux 0.11 源码&#xff0c;基于《Linux内核完全注释》赵炯 1 asm.s 文件 我们先假设该文件处理的中断是无特权过渡的情况…

【精华文】C语言结构体特殊情况分析:结构体指针 / 基本数据类型指针,指向其他结构体

参考链接&#xff1a;Structure pointer pointing to different structure instance 注&#xff1a;可以查看此篇的问题和唯一的回复&#xff0c;那是相对正确的&#xff0c;不要看comment&#xff0c;有很多错误。 我是拒绝分析这种问题的&#xff0c;因为似乎没有人会这么乱用…