青岛大学_王卓老师【数据结构与算法】Week05_11_栈与递归_学习笔记

news2024/7/7 16:26:54

本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。

一方面用于学习记录与分享,

另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。

如有侵权,请留言作删文处理。

课程视频链接:

数据结构与算法基础–第05周11–3.4栈和递归

📚 【Week05】11_栈与递归

递归的定义

(1) 若一个对象部分地包含它自己,或用它自己给自己定义,则称这个对象是递归的。

(2) 若一个过程直接或间接地调用自己,则称这个过程是递归的过程。

例如:递归求 n 的阶乘

long Fact(long n){
	if(n == 0)
        return 1;
    else
        return (n * Fact(n-1));
}

以下三种情况尝尝用到递归方法

(1) 递归定义的数学函数

阶乘函数

在这里插入图片描述

2 阶 Fibonaci 数列

在这里插入图片描述

(2) 具有递归特性的数据结构

在这里插入图片描述

(3) 可递归求解的问题

迷宫问题

Hanoi 塔问题

递归问题——用分治法求解

分治法

对于一个较为复杂的问题,能够分解成几个相对简单的且解法相同或类似的子问题来求解

必备的三个条件

(1) 能够将一个问题转变为一个新问题,且新问题与原问题的解法相同或类同,不同的仅是处理的对象,且这些处理对象是变化且有规律的

(2) 可以通过上述转化而使问题简化

(3) 必须有一个明确的递归出口,或称递归的边界

分治法求解递归问题算法的一般形式
void p(参数表){
    if(递归结束条件)
        可直接求解步骤;	// -- 基本项
    else
        p(较小的参数);	 // -- 归纳项
}

例如

long Fact(long n){
	if(n == 0)
        return 1;					// -- 基本项
    else
        return (n * Fact(n-1));		// -- 归纳项
}
函数调用过程

调用前,系统完成:

(1) 将实参,返回地址等传递给被调用函数

(2) 为被调用函数的局部变量分配存储区

(3) 将控制转移到被调用函数的入口

调用后,系统完成:

(1) 保存被调用函数的计算结果

(2) 释放被调用函数的数据区

(3) 依照被调用函数保存的返回地址将控制转移到调用函数

当多个函数构成嵌套调用时:
int main(void){
    ...;
    y = fact(3);
    ...;       
}

double fact(int n){
    ...;
    z = mypow(3.5, 2);
    ...;
}

double mppow(double x, int n){
    ...;
}


遵循后调用的先返回

求解阶乘 n ! 的过程
long Fact(long n){
	if(n == 0)
        return 1;
    else
        return (n * Fact(n-1));
}

在这里插入图片描述

递归函数调用的实现

在这里插入图片描述

进行 fact(4) 调用的系统栈的变化状态

在这里插入图片描述

递归的优缺点

优点:结构清晰,程序易读

缺点:每次调用要生成工作记录,保存状态信息,入栈;返回时要出栈,恢复状态信息。时间开销大。

递归 -> 非递归

方法1:尾递归、单向递归 -> 循环结构

方法2:自用模拟系统的运行时栈

尾递归 -> 循环结构
long Fact(long n){
	if(n == 0)
        return 1;
    else
        return (n * Fact(n-1));
}

转换为循环

long Fact(long n){
	t = 1;
	for(int i=1; i<n; i++){
		t = t*i;
	}
    return t;
}
单向递归 -> 循环结构

虽然有一处以上的递归调用语句,但各次递归调用语句的参数只和主调函数有关,相互之间参数无关,

并且这些递归调用语句处于算法的最后

// Fibonacci 数列
long Fib(long n){
    if(n == 1 || n == 2)
        return 1;
    else 
        return (Fib(n-1) + Fib(n-2));
}

转换为

// Fibonacci 数列
long Fib(long n){
    if(n == 1 || n == 2)
        return 1;
    else {
        t1 = 1;
        t2 = 1;
        for(i=3; i<n; i++){
            t3 = t1 + t2;
            t1 = t2;
            t2 = t3;
        }
        
        return t3;
    }
}
借助栈改写递归

(1) 递归程序在执行时,需要系统提供栈来实现

(2) 仿照递归算法执行过程中递归工作栈的状态变化可写出相应的非递归程序

(3) 改写后的非递归算法与原来的递归算法相比,结构不够清晰,可读性较差,有的还需要经过一系列优化

了解内容

借助栈改写递归的方法

(1) 设置一个工作栈存放递归工作记录 (包括实参、返回地址及局部变量等)。

(2) 进入非递归调用入口 (即被调用程序开始处)将调用程序传来的实在参数和返回地址入栈(递归程序不可以作为主程序,因而可认为初始是被某个调用程序调用)。

(3) 进入递归调用入口: 当不满足递归结束条件时,逐层递归,将实参、返回地址及局部变量入栈,这一过程可用循环语句来实现一模拟递归分解的过程。

(4) 递归结束条件满足,将到达递归出口的给定常数作为当前的函数值。

(5) 返回处理: 在栈不空的情况下,反复退出栈顶记录,根据记录中的返回地址进行题意规定的操作,即逐层计算当前函数值,直至栈空为止一模拟递归求值过程。

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

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

相关文章

考虑设备动作损耗的配电网分布式电压无功优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Nginx】proxy_set_header的变量与X-Forwarded-For伪造客户端IP漏洞

前言 上面突然说&#xff0c;需要检查Nginx反向代理的安全问题并给出了修改方法&#xff0c;小白的我一脸懵逼&#xff0c;明明都是中文&#xff0c;连在一起咋就看不明白了。于是乎&#xff0c;对着修改内容简单学习了一下&#xff0c;在此做个记录&#xff0c;如有问题请大佬…

【Ubuntu】Ubuntu14 安装 open-jdk-1.7(open-jdk-7) 最新 持续更新中

【Ubuntu】Ubuntu14 安装 open-jdk-1.7&#xff08;open-jdk-7&#xff09; 最新 持续更新中 一、概述二、特别说明三、开发环境四、安装 open-jdk-1.7五、配置环境1、配置环境变量路径2、环境变量3、完成安装 一、概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。…

Hive3.1.2伪分布式安装

Hive3.1.2安装 前言 Hive是何物&#xff0c;自己去百度&#xff0c;在此不多bb&#xff0c;直接开整… 学习一个组件&#xff0c;个人觉得最重要的是先学会安装再说&#xff0c;巧妇难为无米之炊撒… 下载 下载地址&#xff1a;https://downloads.apache.org/hive/hive-3.…

Python探索金融数据进行时间序列分析和预测

大家好&#xff0c;时间序列分析是一种基于历史数据和趋势分析进行预测的统计技术。它在金融和经济领域非常普遍&#xff0c;因为它可以准确预测趋势并做出明智的决策。本文将使用Python来探索经济和金融数据&#xff0c;执行统计分析&#xff0c;并创建时间序列预测。 我们将…

面试题更新之-CSS Hack是什么?ie6,7,8的hack分别是什么?

文章目录 导文CSS Hack的定义广泛应用的CSS Hack技巧ie6,7,8的hack分别是什么&#xff1f; 导文 面试题更新之-CSS Hack是什么?ie6,7,8的hack分别是什么&#xff1f; CSS Hack的定义 CSS Hack指的是在CSS中使用一些特定的代码或技巧&#xff0c;通过利用不同浏览器对CSS实现的…

大学生用一周时间给麦当劳做了个App(安卓版)

背景 有个大学生粉丝最近私信联系我&#xff0c;说基于我之前开源的多语言项目做了个仿麦当劳的项目&#xff0c;虽然只是个样子货&#xff0c;但是收获颇多&#xff0c;希望把自己写的代码开源出来供大家一起学习进度。这个小伙伴确实是非常积极上进&#xff0c;很多大学生&a…

Grid++Report 6.8.6 Crack

GridReport报表开发工具总体介绍 报表开发工具概述 GridReport是一款同时支持C/S软件(桌面程序)与B/S软件(WEB程序)开发的报表工具&#xff0c;功能全面易学易用。C/S开发适用于VB.NET、C#、VB、VC、Delphi、CBuilder、QT与易语言等。B/S开发适用于ASP.NET(C# & VB.NET),…

蒲公英打包环境搭建碰到问题

一&#xff1a;证书那边选择手动&#xff0c;不要自动&#xff0c;——》debug配置dev证书&#xff0c;release配置ad-hoc证书 二&#xff1a;证书有时候不生效&#xff0c;删除重新下载。~/Library/MobileDevice/Provisioning Profiles 三&#xff1a;更新测试手机时&#…

数字化孪生技术在工业上的应用场景和案例分享

编者按&#xff1a;数字化孪生是一个完整的生命周期概念&#xff0c;它从设计和制造开始&#xff0c;贯穿整个生产过程&#xff0c;直到产品退役。数字化孪生将现实世界和虚拟世界相结合&#xff0c;使企业能够更好地理解和优化物理系统的运行情况&#xff0c;从而提高生产效率…

Java多线程下的单例模式参考

Java多线程下的单例模式参考 单例有多种的写法&#xff0c;本例是懒汉式单例的一种写法。在高并发环境下需要注意的是&#xff1a; 1.单例在并发访问并调用其相应的getInstance方法的时候也会造成创建多个实例对象&#xff0c;加锁是必要的。 2.使用synchronized是比较好的解…

基于预测控制模型的自适应巡航控制仿真与机器人实现(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 自适应巡航控制技术为目前由于汽车保有量不断增长而带来的行车安全、驾驶舒适性及交通拥堵等问题提供了一条有效的解决途径&am…

JS、Vue鼠标拖拽

JS代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevic…

Python Web框架 Flask 安装、使用

Python Web框架 Flask 安装 安装 Flask 框架 首先需要安装 Flask 框架, 可以通过以下命令安装: [rootlocalhost web]# pip3 install Flask Collecting FlaskDownloading Flask-2.0.3-py3-none-any.whl (95 kB)|██████████████████████████████…

七大排序算法——归并排序,通俗易懂的思路讲解与图解(完整Java代码)

文章目录 一、排序的概念排序的概念排序的稳定性七大排序算法 二、归并排序核心思想代码实现 三、性能分析四、七大排序算法性能对比 一、排序的概念 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0…

基于Java的考研教室在线预约系统/基于springboot的考研教室在线预约系统

摘 要 网络的广泛应用给生活带来了十分的便利。所以把考研教室在线预约与现在网络相结合&#xff0c;利用java语言建设考研教室在线预约系统&#xff0c;实现考研教室在线预约的信息化。则对于进一步提高考研教室在线预约发展&#xff0c;丰富考研教室在线预约能起到不少的促进…

Spark编程-RDD

RDD创建方式 第一种&#xff1a; 读取外部数据集。例如&#xff1a;从本地文件加载数据集&#xff0c;或者从HDFS文件系统、HBase等外部数据源中加载数据集。 Spark可以支持文本文件、SequenceFile文件&#xff08;Hadoop提供的 SequenceFile是一个由二进制序列化过的key/valu…

MySQL的数据备份与还原--练习题

MySQLdump MySQLdump是MySQL提供的一个非常有用的数据库备份工具。MySQLdump命令执行时&#xff0c;可以将数据库备份成一个文本文件&#xff0c;该文件中实际上包含了多个CREATE 和 INSERT语句&#xff0c;使用这些语句可以重新创建表和插入数据。 看题&#xff1a; 第一题&a…

开源共建,360推出WatchAD2.0域安全威胁感知系统新版本

不论是在攻防演练还是真实入侵对抗场景中&#xff0c;攻击者往往通过攻击域控获取特权管理权限进而横向控制企业内网&#xff0c;窃取重要资产和数据&#xff0c;凭借独特的管理优势&#xff0c;AD域被广泛应用于大型企业的IT基础设施的集中管理。 然而&#xff0c;传统的网络…

【手撕C语言基础】结构体(2)

(꒪ꇴ꒪(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误…