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

这篇具有很好参考价值的文章主要介绍了青岛大学_王卓老师【数据结构与算法】Week05_11_栈与递归_学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

课程视频链接:

数据结构与算法基础–第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) 递归定义的数学函数

阶乘函数

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

2 阶 Fibonaci 数列

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

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

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

(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));
}

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

递归函数调用的实现

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

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

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

递归的优缺点

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

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

递归 -> 非递归

方法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) 返回处理: 在栈不空的情况下,反复退出栈顶记录,根据记录中的返回地址进行题意规定的操作,即逐层计算当前函数值,直至栈空为止一模拟递归求值过程。文章来源地址https://www.toymoban.com/news/detail-565611.html

到了这里,关于青岛大学_王卓老师【数据结构与算法】Week05_11_栈与递归_学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 青岛大学_王卓老师【数据结构与算法】Week05_08_顺序栈的操作2_学习笔记

    本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享, 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–第05周08–3.3栈的表示和实现4–3.

    2024年02月16日
    浏览(90)
  • 青岛大学_王卓老师【数据结构与算法】Week05_14_队列的顺序表示和实现2_学习笔记

    本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享, 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–第05周14–3.5队列的表示和实现3–

    2024年02月16日
    浏览(60)
  • 青岛大学_王卓老师【数据结构与算法】Week05_13_队列的顺序表示和实现1_学习笔记

    本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享, 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–第05周13–3.5队列的表示和实现2–

    2024年02月17日
    浏览(42)
  • 青岛大学_王卓老师【数据结构与算法】Week05_01_栈和队列的定义和特点1_学习笔记

    本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享, 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–第05周01–3.1栈和队列的定义和特点

    2024年02月15日
    浏览(40)
  • 青岛大学_王卓老师【数据结构与算法】Week03_11_线性表的链式表示和实现11_学习笔记

    本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享,另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–第3周11–2.5线性表的链式表示和实现

    2024年02月12日
    浏览(40)
  • 数据结构与算法基础(青岛大学-王卓)(5)

    叮叮咚咚,新一期来袭,我还在吃桃子,吃桃子,吃桃子。。。串和python的字符串差不多,数组和广义表像是python的list 串(string) - 字符串 概念及术语 定义: 零个或多个任意字符组成的有限序列,是一种内容受限的线性表 子串 : 串中任意个连续字符组成的子序列称为该串的

    2024年02月09日
    浏览(51)
  • 数据结构与算法基础(青岛大学-王卓)(6)

    啊呀呀,不小心又断更快一个月了,我还是认真每天学习滴,最近还是香瓜,菜瓜,西瓜,羊角蜜不能停口啊,哈哈,二叉树这一章真是硬茬,难啃啊。 树的定义 树的深度 :树中节点的最大层次 有序树 : 树中结点的各子树从左至右有次序 ( 最左边的为第一个孩子 ) 无序

    2024年02月16日
    浏览(55)
  • 数据结构与算法基础(青岛大学-王卓)(1)

    程序=数据结构+算法 数据(data) 数值型 非数值型(文字,图像…) 数据元素(data element) 数据的基本单位,在程序中当做一个整体进行考虑和处理(如表中的一行包含多列信息) 是数据这个集合的个体 数据项(data item) 构成数据元素的不可分割的 最小单位 () 数据对象(data object) 性质相

    2024年02月03日
    浏览(47)
  • 体验百度文心一言AI大模型生产生成河南大学、太原理工大学、哈尔滨工程大学和青岛大学简介

    河南大学(Henan University),简称“河大”,坐落于中国河南省,是河南省人民政府与中华人民共和国教育部共建高校,国家“双一流”建设高校,入选国家“111计划”、中西部高校基础能力建设工程、卓越医生教育培养计划、卓越法律人才教育培养计划、卓越教师培养计划、

    2024年02月11日
    浏览(52)
  • 24届近3年青岛理工大学自动化考研院校分析

    今天给大家带来的是 青岛理工 大学 控制考研分析 满满干货~还不快快点赞收藏  青岛理工大学是一所以工为主,土木建筑、机械制造、环境能源学科特色鲜明,理工经管文法艺等学科协调发展的多科性大学。是国家首批地方高校“111计划”建设单位、全国首批深化创新创业

    2024年02月13日
    浏览(92)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包