递归

第3章 栈和队列

。_饼干妹妹 提交于 2020-02-05 09:01:48
3.1 栈的定义及抽象数据类型 栈(stack)是一种特殊的线性表,这种表只能在固定的一端进行插入与删除运算。通常称固定插入、删除的一端为栈顶(top),而另一端称为栈底(bottom)。位于栈顶和栈底的元素分别称为顶元和底元。当表中没有元素时,称为空栈。为了与一般的线性表相区别,通常将栈的插入操作称为入栈,将删除操作称为出栈。 线性表S=(a,b,c,d,e) 将S中的元素按照a、b、c、d、e的顺序依次入栈,则出栈的元素顺序为e、d、c、b、a 可以发现,最先进入栈中的元素a最后才出栈,最后入栈的元素e最先被出栈,因为栈的这一特性,故又将其称为后进先出的线性表(lastinfirstout,简称为LIFO)。 3.2 栈的实现 栈的实现既可以采用顺序存储结构也可以采用链式存储结构。采用顺序存储结构实现的栈称为顺序栈,采用链式存储结构实现的栈称为链栈 3.2.1 顺序栈 栈的初始化操作是指按指定的大小为栈动态分配一片连续的存储区,并将该存储区的首地址同时送给栈顶指针top和栈底指针base,表示栈里没有任何元素,此时的栈为空栈。若base的值为NULL时则表明栈不存在。当插入一个新元素时栈顶指针加1,当删除一个元素时栈顶指针减1。栈顶指针top始终比顶元超前一个位置,因此栈满的条件是top-base=stacksize。图3-3所示为栈顶指针和栈中元素的关系。 值得注意的是

递归与迭代

南楼画角 提交于 2020-02-05 03:06:52
迭代 迭代 :迭代简单来讲就是循环:类比于我们循环输出某一个字符数组时的情景:从字符数组中不断取出字符,再将字符输出。迭代的循环过程则是从栈(或者队列)中不断取出要操作的元素,进行操作,与普通循环过程不同的是在不断取出元素的同时也会向栈中放入元素,从而实现迭代过程。因而迭代的要点有:迭代的初始条件,迭代过程中迭代元素生成,迭代结束条件判断。 迭代示例: 斐波那契数列 //迭代,时间复杂度O(n),空间复杂度O(1) int fib2(int n) { if (n < 2) return n; int n0 = 0, n1 = 1; int temp; for (int i = 2; i <= n; i++) { temp = n0; n0 = n1; n1 = temp + n1; } return n1; } 递归 递归 :递归简单来讲就是函数的自身调用:要实现这个过程,函数要包含循环的条件和调用自身的语句,通过这个不断自身调用的过程把问题不断化简,最终达到解决的目的。 递归类型:(主要分为递归产生返回值和递归处理引用入参这两种情形) 1.递归产生返回值 //示例1:斐波那契数列: 普通递归,时间复杂度O(2^n),空间复杂度O(n) int fib(int n) { if (n < 2) return n; return fib0(n - 1) + fib0(n - 2); }

函数递归调用

妖精的绣舞 提交于 2020-02-05 02:29:06
在调用函数的过程又出现直接或间接的调用该函数本身,称为函数的递归调用 递归函数需要终止条件 例1:用递归求n!. 思路:求n!可以用递推方法,即从1开始,乘2,再乘…直乘到n。这种方法 容易理解,也容易实现。递推法的特点是从一个已知的事实(如1!=1)出发,按一定规律推 出下一个事实(如2!=1! * 2),再从这个新的已知的事实出发,再向下推出一个新的事实(3!=3¥2!)。n!=n* (n- 1)!。 求n!也可以用递归方法,即5!等于4!X5,而4!=3!X4…,1!=1。 例2:Hanoi(汉诺)塔问题。 这是一个古典的数学问题,是一个用递归方法解题 的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座A,B.C。开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上(见图。有一个老和尚想把这64个 盘子从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。要求编程序输出移动盘子的步骤。 解题思路: 需要找到一个解决问题的思路,把看似复杂的问题简单化,使问题得以迎刃而解。老和 尚会这样想:假如有另外一一个和尚能有办法将上面63个盘子从一个座移到另一座。那么, 问题就解决了。此时老和尚只须这样做: (1)命令第2个和尚将63个盘子从A座移到B座; (2)自己将1个盘子(最底下的、最大的盘子

递归实现角谷算法

给你一囗甜甜゛ 提交于 2020-02-05 01:17:06
#include using namespace std; int Kakutani_theorem(int n, int step) { if (n == 1) { cout << n; return step; } if (n % 2 == 0) { step++; cout << n<<" "; return Kakutani_theorem(n / 2, step); } else { step++; cout << n << " "; return Kakutani_theorem(n*3+1 , step); } } int main() { int n = 0; cin >> n; cin.clear(); cout << "所有进行过程为: "; int step=Kakutani_theorem(n,0); cout << endl; cout << "步数为: " << step; return 0; } 来源: CSDN 作者: ldbite 链接: https://blog.csdn.net/ldbite/article/details/104172293

面试中遇到递归算法

喜夏-厌秋 提交于 2020-02-05 00:15:29
前几天在博客园看到有人面试时,遇到递归算法题,一时手痒就解了一个。顺便网上又找来几个,也实现了。给大家分享一下,开阔一下思路,没准你明天面试就能用上。 1、编写一个方法用于验证指定的字符串是否为反转字符,返回true和false。请用递归算法实现。(反转字符串样式为"abcdedcba") 2、一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30个是多少 3、一列数的规则如下: 1、12、123、1234、12345、123456......,求第n个数的递归算法(n<=9)。 4、将一整数逆序,如987654321变为123456789。 5、一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能行有多少种? 以上的前提:不能用数组 或转成字符串处理,也不能用内置函数,如C#的幂函数(Math.Pow) 1 using System; 2 3 namespace RecursionAlgorithms 4 { 5 class Program 6 { 7 private static bool fn1(ref string str, ref int from, ref int to) 8 { 9 if (from >= to) return true; 10 if (str[from++] != str[to--]) return false;

递归和斐波那契数列

非 Y 不嫁゛ 提交于 2020-02-04 23:56:48
递归 递归概念图 斐波那契数列 斐波那契数列为1、1、2、3、5、8、13、21、34……此数列从第3项开始,每一项都等于前两项之和,递推公式为F(n)=F(n-1)+F(n-2),n≥3,F(1)=1,F(2)=1。 Java实现斐波那契数列 package com . xingyun . digui ; /* * 递归思想,自己调用自己,不过需要控制好条件,满足条件才可以继续调用,否则无限调用会导致栈溢出 * */ public class DiGui { /* * 斐波那契数列 * 斐波那契数列为1、1、2、3、5、8、13、21、34…… * 此数列从第3项开始,每一项都等于前两项之和, * 递推公式为F(n)=F(n-1)+F(n-2),n≥3,F(1)=1,F(2)=1。 * * */ public static void main ( String [ ] args ) { System . out . println ( feibonaqi ( 10 ) ) ; } //递归实现斐波那契数列 public static int feibonaqi ( int i ) { if ( i == 1 || i == 2 ) { return 1 ; } else { return feibonaqi ( i - 2 ) + feibonaqi ( i - 1 ) ; }

Python学习,第八课 - 函数

一个人想着一个人 提交于 2020-02-04 21:55:42
本次讲解函数,由于内容比较多,小编列了个大纲,主要有一下内容: 1. 函数基本语法及特性 2. 函数参数 3.局部变量 4. 返回值 5.嵌套函数 6.递归 7.匿名函数 8.高阶函数 9.内置函数 1. 函数基本语法及特性 函数的定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 函数的特性: 减少重复代码 使程序变的可扩展 使程序变的易维护 函数的语法定义 直接上代码: # def 是定义函数的关键字 def test():#test既是函数名 print('学习Python的第一个函数') test() #调用函数 同时函数也可以带参数 a, b = 1, 3 # 带参函数 def test(x, y): # x 和 y 即是在我们调用函数时传入的参数 return x + y # 返回执行的结果 c = test(a, b) # 把函数返回结果赋值给 C print(c) 2. 函数参数 在说函数参数前,大家需要了解一个知识点, 形参 & 实参 何为形参? 既变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。 因此,形参只在函数内部有效,函数调用结束返回主调用函数后则不能再使用该形参变量 何为实参? 既可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值

从入门到自闭之Python递归

倾然丶 夕夏残阳落幕 提交于 2020-02-04 18:19:48
递归:不断地调用自身,用函数实现 死递归(死循环): def func(): print(1) func() func() 知识点:官方说明最大深度1000,但实际执行998或997以下,看电脑性能 满足两个条件才是递归 不断调用自身 有明确的终止条件 举例:以计算年龄为例 def age(n): if n == 1: return 18 else: return age(n-1)+2 print(age(3)) #3代表执行三次 拆解: ![image-20190627140416004](C:\Users\heyul\Desktop\image-20190627140416004.pngdef age1(n): if n == 1: return 18 else: return age2(n-1)+2 def age2(n): if n == 1: return 18 else: return age3(n - 1) + 2 def age3(n): if n == 1: return 18 print(age1(3)) 流程图: 图中红色箭头是递的过程,蓝色箭头是归的过程 来源: https://www.cnblogs.com/heyulong1214/p/11528105.html

【剑指offer】斐波那契数列

落爺英雄遲暮 提交于 2020-02-04 13:14:33
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39 下面首先会简单介绍递归算法,然后给出递归算法的解法代码,以及使用非递归算法的解决代码,最后是简单使用动态规划的方法解决。 递归算法 斐波那契数列是典型的递归代表。递归算法的核心在于两点: 结束递归的边界条件 递归公式 递归公式简单理解起来,就是类似于我们高中数学里可以用式子表达的数列,类似于初中学的找前后的规律,只是把这个规律公式化了。 递归算法的两个核心要点,对应到代码算法的实现,也就是以下 3 步: 找整个递归的终止条件:递归应该在什么时候结束? 找返回值:应该给上一级返回什么信息? 本级递归应该做什么:这一级递归中,要完成什么任务? 举个例子:假设有个数列 1 3 5 7 9 11 … 找到第n项的值。在这个数列中,开始的一项是 1,是无规律可循的一项,这一项到数列的尽头了,是 “结束” 项;此后,每一项都是在其前一项的基础上加 2,得到的。因此可以写为: 边界条件:f(1) = 1 递归公式:f(n) = f(n-1)+2 找到上述的两个要点,就可以实现递归算法。 解题思路 这一道题中,要求返回斐波那契数列的第 n 项,从 0 开始。 斐波那契数列:0 1 1 2 3 5 8 13 … 可以知道其边界条件和递归公式分别为: fibonacci(1) =

python的递归

China☆狼群 提交于 2020-02-04 11:39:27
二、 递归 2.1递归的应用场景 递归是一种编程思想,应用场景: 1在我们日常开发中,如果要遍历一个文件夹下的所有文件,通常使用递归来实现; 2在后续的算法中很多算法都离不开递归,例如快速排序 2.1.1递归的特点 函数内部自己调用自己 必须有出口 def sum_number ( i ) : if i == 1 : #出口 return 1 return i + sum_number ( i - 1 ) resoult = sum_number ( 3 ) print ( resoult ) 三、lambda表达式 3.1lambda得应用场景 如果一个函数有一个返回值,并且只有一句代码,可以使用lambda简化 3.2lambda语法 lambda . 参数列表 :表达式 注意: lambda表达式得参数可有可无,函数得参数在lambda表达式中完全使用。 lambda表达式能接受任何数量的参数但只返回一个表达式的值 快速入门 def fn1 ( ) : return 200 print ( fn1 ) print ( fn1 ( ) ) #lambda 匿名函数 fn2 = lambda : 100 print ( fn2 ) print ( fn2 ( ) ) """ <function fn1 at 0x00000135323AD268> 内存地址 200