递归算法

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. 函数参数 在说函数参数前,大家需要了解一个知识点, 形参 & 实参 何为形参? 既变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。 因此,形参只在函数内部有效,函数调用结束返回主调用函数后则不能再使用该形参变量 何为实参? 既可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值

【剑指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

二叉树遍历的递归与非递归写法_C语言

巧了我就是萌 提交于 2020-02-03 12:11:46
前言 中序遍历的非递归写法 后序遍历的非递归写法 完整代码 前言 二叉树的三种遍历的递归写法,只要理解思想,几行代码就可以完成。可是非递归写法却很不容易。这里特地总结下,透彻解析它们的非递归写法。其中,中序遍历的非递归写法最简单,后序遍历最难。 中序遍历的非递归写法 非递归算法,必然要用到栈(可参考完整代码中栈的实现)。这里着重讲下中序遍历的写法。 void InorderTraversal ( BinTree BT ) { BinTree T ; Stack TreeStack ; TreeStack = CreateStack ( ) ; T = BT ; while ( T || ! IsEmpty ( TreeStack ) ) { //注意循环结束的条件 while ( T ) { //将左子树一口气全部入栈 Push ( TreeStack , T ) ; T = T -> Left ; } T = Pop ( TreeStack ) ; // 退出循环时,T为空,即再无左子树 printf ( "%d " , T -> Data ) ; //此时,打印该节点值 T = T -> Right ; //而后,转向右子树,若该节点为叶子节点, //则T仍为空,下一次循环直接出栈, //此处巧妙将叶子节点与常规节点的代码统一 } } 后序遍历的非递归写法

python实现二分查找(递归、非递归)

↘锁芯ラ 提交于 2020-02-03 05:47:13
本文用python3实现了二分查找算法,分别使用递归方法和非递归方法。 (一)递归实现 def binarySearch(s, k): return binarySearch_c(s, 0, len(s) - 1, k) def binarySearch_c(s, low, high, k): if low > high: return -1 mid = low + (high - low) // 2 if s[mid] == k: return mid elif s[mid] > k: return binarySearch_c(s, low, mid - 1, k) else: return binarySearch_c(s, mid + 1, high, k) for _ in range(int(input())): s = list(map(int, input().split())) k = int(input()) print(binarySearch(s, k)) (二)非递归实现 def binarySearch(s, k): low = 0 high = len(s) - 1 while low <= high: mid = low + (high - low) // 2 if s[mid] == k: return mid elif s[mid] > k:

你所能用到的数据结构(四)

倖福魔咒の 提交于 2020-02-03 05:38:29
五、如何递,怎样归? 很多人看完递归的原理之后会有这种感觉,喔,这个原理我懂了,然后再找一道其余的题目看一看能不能写的出来,突然发现,我勒个去,还是不会。其实这种现象很普遍,所以如果你是这种的,也没有什么好沮丧的,我敢保证你能看的懂递归的执行过程,基本上已经比30%的人要强了。所以我觉得,我写一写我对递归思维的理解好了。递归这个词我的理解应该是传递和回归,如何把自身的状态传递下去和如何回归到一个结果上是递归问题的基本思维方式。 所谓如何传递,我觉得思维的难点是如何抽象出数学模型,如果是斐波那契数列那种有明确公式的话,很简单,直接按照公式该怎么操作怎么操作,难得是只有叙述性语言的,比如这种题目:有一段楼梯n个阶梯,你可以选择一次上一个阶梯,也可以选择一次上两个阶梯,请问走到顶部一共有多少种走法?看似很高深吧?其实这就是斐波那契数列的一个变体而已。这种描述性的题目如果要抽象出数学模型,我觉得最好的办法就先列举几个试试,先看看有什么规律没有,然后再猜想,再证明。你先看看你上2层楼梯有几种方法,2层楼梯要么是1次性上去,要么分成两步,一次性上一步,于是就是F(2)=2,如果只有一层和没有呢,那明显只有一种走法(一次上一层和不走),也就是F(0)=1,F(1)=1,下面,你要上第三层,你的办法要么是从第二层上一层到第三层,要么是在第一层上两层到第三层,要么一层一层的走上去,这样F(3)=3

归纳程序员必须掌握的核心算法(详细)

大城市里の小女人 提交于 2020-02-02 07:22:59
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我, 数据结构与算法应该要学习到哪个程度呢? ,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是 零散 的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。 一、算法最最基础 1、时间复杂度 2、空间复杂度 一般最先接触的就是时间复杂度和空间复杂度的学习了,这两个概念以及如何计算,是必须学的,也是必须最先学的,主要有最大复杂度、平均复杂度等,直接通过博客搜索学习即可。 文章推荐: 算法分析神器—时间复杂度 二、基础数据结构 1、线性表 列表(必学) 链表(必学) 跳跃表(知道原理,应用,最后自己实现一遍) 并查集(建议结合刷题学习) 不用说,链表、列表必须,不过重点是链表。 三分钟基础数据结构:如何轻松手写链表? 以后有面试官问你「跳跃表」,你就把这篇文章扔给他 2、栈与队列 栈(必学) 队列(必学) 优先队列、堆(必学) 多级反馈队列(原理与应用) 特别是优先队列,再刷题的时候,还是经常用到的,队列与栈,是最基本的数据结构,必学。可以通过博客来学习。相关文章: 三分钟基础知识:什么是栈?

递归算法

六眼飞鱼酱① 提交于 2020-01-31 19:55:44
用递归计算斐波那契数列,那么什么是斐波那契数列呢?这里引用百度百科的定义:斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义: F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*) 代码如下: public class Test01 { public static void main(String[] args) { System.out.println(f(8)); } public static int f(int n) { if(n<=2) { return 1; } return f(n-2)+f(n-1); } } 用递归计算数,需要注意关键的三点。第一,必须有跳出的条件,否则会导致内存溢出,比如上面的代码找到了第8项,递归回调8次就跳出来了;第二,必须给初始值赋值,否则无法计算出数; 第三,需要推导出要计算的表达式。用递归计算斐波那契数列的表达式的规律为,前两项的加起来等于第三项,用数学表达式即为:F(n)=F(n - 1)+F(n - 2) 来源: https://www

递归与回溯思想的应用——以八皇后问题为例

独自空忆成欢 提交于 2020-01-31 14:54:42
1.递归与回溯 1.1递归 乍一听很高深,其实理解起来很轻松,但是面对问题时如何动手编写递归程序却十分棘手! 递归程序的流程图很清晰,非常直观。所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。 递归与循环有本质区别:简单来说,循环是有去无回,而递归则是有去有回(因为存在终止条件)。 递归与栈的关系:常常听到 “递归的过程就是出入栈的过程”,这句话怎么理解?我们以阶乘代码为例,取 n=3,则过程如下: 第 1~4 步,都是入栈过程,Factorial(3)调用了Factorial(2),Factorial(2)又接着调用Factorial(1),直到Factorial(0); 第 5 步,因 0 是递归结束条件,故不再入栈,此时栈高度为 4,即为我们平时所说的递归深度; 第 6~9 步,Factorial(0)做完,出栈,而Factorial(0)做完意味着Factorial(1)也做完,同样进行出栈,重复下去,直到所有的都出栈完毕,递归结束。 每一个递归程序都可以把它改写为非递归版本。我们只需利用栈,通过入栈和出栈两个操作就可以模拟递归的过程,二叉树的遍历无疑是这方面的代表。但是并不是每个递归程序都是那么容易被改写为非递归的。某些递归程序比较复杂,其入栈和出栈非常繁琐,给编码带来了很大难度

想了解递归神经网络?这里有一份入门教程

久未见 提交于 2020-01-31 11:04:32
导语:递归网络是一类人工神经网络,用于识别诸如文本、基因组、手写字迹、语音等序列数据的模式,或用于识别传感器、股票市场、政府机构产生的数值型时间序列数据。 递归神经网络入门教程 引言 递归神经网络是一类人工神经网络,可用于识别诸如文本、基因组、手写字迹、语音等序列数据的模式,也可用于识别传感器、股票市场、政府机构产生的数值型时间序列数据。递归网络可以说是最强大的神经网络,甚至可以将图像分解为一系列图像块,作为序列加以处理。由于递归网络拥有一种特定的记忆模式,而记忆也是人类的基本能力之一,所以下文会时常将递归网络与人脑的记忆活动进行类比。 前馈网络回顾 要理解递归网络,首先需要了解前馈网络的基础知识。这两种网络的名字都来自于它们通过一系列网络节点数学运算来传递信息的方式。前馈网络将信息径直向前递送(从不返回已经过的节点),而递归网络则将信息循环传递。 在前馈网络中,样例输入网络后被转换为一项输出;在进行有监督学习时,输出为一个标签。也就是说,前馈网络将原始数据映射到类别,识别出信号的模式,例如一张输入图像应当给予“猫”还是“大象”的标签。 我们用带有标签的图像定型一个前馈网络,直到网络在猜测图像类别时的错误达到最少。将参数,即权重定型后,网络就可以对从未见过的数据进行分类。已定型的前馈网络可以接受任何随机的图片组合,而输入的第一张照片并不会影响网络对第二张照片的分类