递归算法

[笔记]《算法图解》第三章 递归

青春壹個敷衍的年華 提交于 2019-12-25 02:08:31
递归 使用栈很方便,因为你无需自己跟踪盒子堆——栈替你这样做了。 使用栈虽然很方便,但是也要付出代价:存储详尽的信息可能占用大量的内存。每个函数调 用都要占用一定的内存,如果栈很高,就意味着计算机存储了大量函数调用的信息。 在这种情况下,你有两种选择。 重新编写代码,转而使用循环。 使用尾递归。这是一个高级递归主题,不在本书的讨论范围内。另外,并非所有的语言都支持尾递归 小结 递归指的是调用自己的函数。 每个递归函数都有两个条件:基线条件和递归条件。 栈有两种操作:压入和弹出。 所有函数调用都进入调用栈。 调用栈可能很长,这将占用大量的内存。 来源: https://www.cnblogs.com/everfight/p/grokking_algorithms_note_3.html

图解算法(三)

喜夏-厌秋 提交于 2019-12-25 02:02:21
递归 1.递归 问题描述,假设有一个上锁的神秘手提箱,要是在一个盒子里,这个盒子里有盒子,而盒子里又有盒子。钥匙就在某个盒子中。为找到钥匙,使用什么算法? 第一种方法: (1)创建一个要查找的盒子dui (2)从盒子堆取出一个盒子,在里面找。 (3)如果找到的是盒子,就将其加入盒子堆,以便以后再查找 (4)如果找到钥匙,则成功 (5)回到第二步 第二种方法: (1)检查盒子中的每样东西 (2)如果是盒子,就回到第一步 (3)如果是钥匙,就成功 第一种方法使用的是while循环:只要盒子堆不为空,就从中取一个盒子,并在其中仔细查找。 伪代码如下 def look_for_key(main_box): pile = main_box.make_a_pile_to_look_through() while pile is not empty: box = pile.grab_a_box(): for item in box: if item.is_a_box(): pile.append(item) elif item.is_a_key(): print "found the key!" 第二种方法使用递归——函数调用自己, 伪代码如下 def look_for_key(box): for item in box: if item.is_a_box(): look_for_key

Python大一上总结

自作多情 提交于 2019-12-25 01:10:15
大一菜鸡Python总结 初次接触Python的一些入门知识 字符串及数据类型等 Python程序控制结构 想要写出一个比较好的程序控制结构,画流程图是非常重要的。想必在高中大家都有所借出流程图吧。以下是 流程图的7个基本元素 运用好基本元素就可以画出一个这样的流程图啦。 分支结构 程序由三种基本结构组成:顺序结构、分支结构、循环结构,这些基本结构都有一个入口和一个出口。任何程序都由这三种基本结构组合而成。 顺序结构 是程序按照线性顺序依次执行的一种运行方式,其中语句块S1和语句块S2表示一个或一组顺序执行的语句 2.分支结构 是程序根据条件判断结果而选择不同向前执行路径的一种运行方式,包括单分支结构和二分支结构。由二分支结构会组合形成多分支结构 3.循环结构 是程序根据条件判断结果向后反复执行的一种运行方式,根据循环体触发条件不同,包括条件循环和遍历循环结构 Python分支结构 共有单分支结构、二分支结构、多分支结构,其中分支结构还可以加入条件判断及组合 单分支结构 if <条件> : <语句块> 2.二分支结构 if <条件> : <语句块1> else : <语句块2> 3.多分支结构 f <条件1> : <语句块1> elif <条件2> : <语句块2> …… else : <语句块N> 条件判断及组合 用于条件组合的三个保留字 Python循环结构

内置函数, 递归, 二分法

て烟熏妆下的殇ゞ 提交于 2019-12-25 00:54:22
一. lambda() a = lambda n: n ** 2 a = lambda x, y: (x, y) a = lambda x, y: x, y 这个需要两个变量名来接收, 把y赋值给第二个变量名 fn = lambda *args: max(args) lambda有返回值 二. sorted() sorted(iterable, key, reverse) lst = sorted(lis, key = lambda el: el[:2], reverse = True) lst = sorted(lis, key = func, reverse = True) func不加括号 sorted函数会把lis的每一个元素交给key, 然后计算出这个元素的权重, 整个函数按权重进行排序, sorted有返回值 三. filter() filter(function, iteraable) f = filter(lambda el: int(el[0]) < 5, lst) print(list(f)) filter函数返回True的都会保留, False都会去除 获取的返回值是一个迭代器 m = map(func1, map(func2, map(func3, lst))) # 分而治之 m = map(lambda x, y, z: x + y + z, [1,2,3

全排列递归实现

南笙酒味 提交于 2019-12-24 17:45:23
BFS一般是不会用递归的,而且很不好实现,因为是采用队列机制,而不是栈机 制。 但是恰恰好的,递归就是栈机制,所以递归其实就是DFS 是栈机制啊,DFS就是栈机制 你要是不用递归,也可以实现DFS,但是要用到栈 递归只是使用了一个自动的栈机制 火星十一郎 设R= {r1,r2,r3,……,rn}是要进行排列的n个元素,Ri=R-{ri}。集合X中的元 素的全排列记为perm(X).(ri)perm(X)表示在全排列perm(X)的每一个排列前加 上前缀ri得到的排列,R的全排列可归纳定义如下: 当n=1,perm(R) = (r) ,其中r是集合R中唯一的元素。 当n>1,perm(R)由(r1)perm(R1),(r2)perm(R2),……,(rn)perm(Rn)构成。 //该算法无法实现重拍,也就是说会重复输出 #include <iostream> using namespace std; void swap(int a[], int i, int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } void perm(int a[], int start, int end) { int i; if(start == end)//当k等于m时,表示已经递归到单个元素全排列(基本 部分) { for(i = 0; i <=

排列组合问题

北慕城南 提交于 2019-12-23 05:49:04
转自博客:http://blog.csdn.net/star143133/article/details/6854745 代码见Problem28 问题1 : 输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串 abc ,则输出由字符 a 、 b 、 c 所能排列出来的所有字符串 abc 、 acb 、 bac 、 bca 、 cab 和 cba 。 思路:这是个递归求解的问题。递归算法有四个特性:(1)必须有可达到的终止条件,否则程序将陷入死循环;(2)子问题在规模上比原问题小;(3)子问题可通过再次递归调用求解;(4)子问题的解应能组合成整个问题的解。 对于字符串的排列问题。如果能生成n - 1个元素的全排列,就能生成n个元素的全排列。对于只有1个元素的集合,可以直接生成全排列。全排列的递归终止条件很明确,只有1个元素时。下面这个图很清楚的给出了递归的过程。 参考代码:解法1通过Permutation_Solution1(str, 0, n); 解法2通过调用Permutation_Solution2(str, str)来求解问题。 view plain copy to clipboard //函数功能 : 求一个字符串某个区间内字符的全排列 //函数参数 : pStr为字符串,begin和end表示区间 //返回值 : 无 void Permutation

字符串的排列组合问题

白昼怎懂夜的黑 提交于 2019-12-23 05:47:56
问题1 : 输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串 abc ,则输出由字符 a 、 b 、 c 所能排列出来的所有字符串 abc 、 acb 、 bac 、 bca 、 cab 和 cba 。 思路:这是个递归求解的问题。递归算法有四个特性:(1)必须有可达到的终止条件,否则程序将陷入死循环;(2)子问题在规模上比原问题小;(3)子问题可通过再次递归调用求解;(4)子问题的解应能组合成整个问题的解。 对于字符串的排列问题。如果能生成n - 1个元素的全排列,就能生成n个元素的全排列。对于只有1个元素的集合,可以直接生成全排列。全排列的递归终止条件很明确,只有1个元素时。下面这个图很清楚的给出了递归的过程。 参考代码:解法1通过Permutation_Solution1(str, 0, n); 解法2通过调用Permutation_Solution2(str, str)来求解问题。 view plain print ? //函数功能 : 求一个字符串某个区间内字符的全排列 //函数参数 : pStr为字符串,begin和end表示区间 //返回值 : 无 void Permutation_Solution1( char *pStr, int begin, int end) { if (begin == end - 1) //只剩一个元素 { for ( int

python算法攻坚

不想你离开。 提交于 2019-12-23 04:06:23
文章目录 递归 什么是递归呢? 递归实现斐波拉契数列 递归 递归在我们编写算法中非常常见,很多算法都是通过递归来实现,递归虽然使用简单,但是想了解其内部流程没有那么简单的。 什么是递归呢? 递归重在搞明白内在的过程,不能之前然而不知其所以然 比如二叉树的深度优先遍历,斐波那契额数列,这些写起来很简单,但是像是回溯就比较难了,如果对递归的本质理解不透彻的话,就写不出正确的算法来 递归最常见的定义: 函数内部调用函数本身。那么这个函数就是递归函数,其本质还是一个循环 递归分为两个过程 :一个是‘递’,一个是‘归’,这些都是自动化完成的 递归一定要设置终止条件 :递归一定要终止,怎么写终止条件很重要 递归实现斐波拉契数列 斐波拉契数列又称黄金分割数列,也叫兔子数列 指的是这样的一个数量,1,2,3,5,8,13,21,34,…后边的数等于前边的数之和,我们要解决的是100个数是多少 #1.什么地方调用递归本身 #2.什么时候终止递归 #1 1 2 3 5 8 13 21 import time total = {} def fib_test(k): """ #求解第k个数的值 :param k: 求解第几个数 :return: """ assert k > 0, '\nk必须大于0' if k in [1,2]: #终止递归 return 1 global total if k not

面试官问你斐波那契数列的时候不要高兴得太早

£可爱£侵袭症+ 提交于 2019-12-23 02:11:17
原文地址:https://www.yanbinghu.com/2019/01/07/16863.html 前言 假如面试官让你编写求斐波那契数列的代码时,是不是心中暗喜?不就是递归么,早就会了。如果真这么想,那就危险了。 递归求斐波那契数列 递归,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。 斐波那契数列的计算表达式很简单: F(n) = n; n = 0,1F(n) = F(n-1) + F(n-2),n >= 2; 因此,我们能很快根据表达式写出递归版的代码: /*fibo.c*/#include <stdio.h>#include <stdlib.h>/*求斐波那契数列递归版*/unsigned long fibo(unsigned long int n){ if(n <= 1) return n; else return fibo(n-1) + fibo(n-2);}int main(int argc,char *argv[]){ if(1 >= argc) { printf("usage:./fibo num\n"); return -1; } unsigned long n = atoi(argv[1]); unsigned long fiboNum = fibo(n); printf("the %lu result is %lu\n",n

深入理解递归

淺唱寂寞╮ 提交于 2019-12-23 01:44:09
递归的思想 以此类推 是递归的基本思想。 具体来讲就是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。 递归的两个条件 可以通过递归调用来缩小问题规模,且新问题与原问题有着相同的形式。(自身调用) 存在一种简单情境,可以使递归在简单情境下退出。(递归出口) 递归算法的一般形式 : 1 2 3 4 5 6 7 func( mode){ if (endCondition){ //递归出口 end; } else { func(mode_small) //调用本身,递归 } } 求一个数的阶乘是练习简单而典型的例子,阶乘的递推公式为:factorial(n)=n*factorial(n-1),其中n为非负整数,且0!=1,1!=1 我们根据递推公式可以轻松的写出其递归函数: 1 2 3 4 5 6 7 8 public static long factorial( int n) throws Exception { if (n < 0 ) throw new Exception( "参数不能为负!" ); else if (n == 1 || n == 0 ) return 1 ; else return n