递归

day19 生成器+函数递归

被刻印的时光 ゝ 提交于 2020-03-25 16:01:09
目录 一、yield表达式 1 yield表达式基本用法 二、三元表达式 三、生成式 1 列表生成式 2 字典生成式 3 集合生成式 4 生成器表达式 四、函数的递归 1 递归的定义 2 详解递归 前引: 上节课思考:多个装饰器的加载和运行分析 def deco1(func1): #func1=warpper2 def wrapper1(*args,**kwargs): print('正在运行===>deco1.wrapper1') res1=func1(*args,**kwargs) return res1 return wrapper1 def deco2(func2):#func2=warpper3 def wrapper2(*args,**kwargs): print('正在运行===>deco2.wrapper2') res2=func2(*args,**kwargs) return res2 return wrapper2 def deco3(x): def outter3(func3): #func3=index def wrapper3(*args,**kwargs): print('正在运行===>deco3.outter3.wrapper3') res3=func3(*args,**kwargs) return res3 return wrapper3

ES6 函数的拓展笔记

爱⌒轻易说出口 提交于 2020-03-25 06:00:54
1.函数参数的默认值   (1)ES6允许为函数的参数设置默认值,即直接写在参数定义的后面。   function log( x, y = 'world' ) { xxx }   function Point( x = 0, y = 0) { xxx }   参数默认值不是传值的,而是每次都重新计算默认值表达式的值。也就是说,参数默认值是惰性求值的。   (2)与解构赋值默认值结合使用    function foo( { x, y = 5 }) { console.log(x, y) };    foo({ }) // undefined,5    foo({ x:1 }) // 1, 5    foo({x:1, y:2 }) // 1, 2    foo() // TypeError:Cannot read property 'x' of undefined    表明,只当函数foo的参数是一个对象是,变量x和y才会通过解构赋值生成。如果foo调用时没有提供参数,变量x和y就不会生成,从而报错。通过提供函数参数的默认值,就可以避免这种情况。   将上段代码参数部分更改为:function foo( { x, y=5 } = { } ){ xxx }; foo() // undefined, 5   表明,如果没有提供参数,函数foo的参数默认为一个空对象。   (3

二叉树的遍历(递归与非递归)

心不动则不痛 提交于 2020-03-24 11:59:55
非递归遍历二叉树是使用栈压栈和弹栈时机不同的思想,在非递归先序遍历中,根据"根左右"的访问顺序不同,先访问当前数据,然后依次压入右儿子和左子;在非递归后序遍历中,需要达到"左右根"的顺序,所以使用两个栈,栈2只存储访问的节点,根据先序遍历的思想修改顺序"根右左",先访问当前节点,然后依次压入左儿子和右儿子,最后输出栈2;在非递归中序遍历中,若当前节点不为空,就压栈,当前节点指向左儿子,若为空且栈不为空,就弹栈,当前节点指向右儿子. import java.util.Stack; public class TreeTraversal { public static class Node{ public int value; public Node left; public Node right; public Node(int Value) { value = Value; } } public void preOrder(Node head) { if(head != null) { System.out.print(head.value + " "); if(head.left != null) { preOrder(head.left); } if(head.right != null) { preOrder(head.right); } } } public void

递归算法题(兔子)

不打扰是莪最后的温柔 提交于 2020-03-24 09:05:22
问题: 古典问题:3个月起每个月都生一对兔子, * 小兔子长到第三个月后每个月又生一对兔子, * 假如兔子都不死,问每个月的兔子总数为多少? 代码: import java.util.Scanner; public class Else {   public static void main(String[] args) {     int n=new Scanner(System.in).nextInt();     int totle = 2;     System.out.println(digui(n)*2);   }   private static int digui(int n) {     int totle = 1;     if (n==1||n==2) {       totle = 1;     }     if (n>2) {       totle = digui(n-1)+digui(n-2);     }     return totle;   } } 来源: https://www.cnblogs.com/-rainbow-/p/7410830.html

图解汉诺塔问题( Java 递归实现)

南楼画角 提交于 2020-03-23 23:05:00
汉诺塔简介 最近在看数据结构和算法,遇到了一个非常有意思的问题——汉诺塔问题。 先看下百度百科是怎么定义汉诺塔的规则的: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 额,好吧,好像有点啰里啰嗦的。其实一句话就是,在三个柱子之间移动盘子,一次只能移动一个,并且要保证每一步上边的盘子都要比下边的盘子小,最终实现把所有的盘子都从最左边柱子移动到最右边的柱子上。 我找了一个小游戏,可以玩一下,体验一下这个过程。相信我,你玩不过第五关的!嘿嘿,玩不过再过来看一下,我是怎么给你做游戏攻略(作弊)的。 地址: http://www.4399.com/flash/109504_1.htm 我相信,有很多童鞋在学递归的时候,都会受到这个问题的困扰。别着急,你不是一个人,我第一次看到这个也是一脸懵逼,这什么鬼啊,这么复杂。下面我通过图解的方式,演示整个移动过程,帮助你理解用递归解决这个问题的思想。 汉诺塔图解 我们一步一步从简单到复杂。为了方便,我把三个柱子从左到右分别叫 A,B,C。盘子的数字从上到下依次增大。 一个盘子 只有一个盘子的时候,就比较简单了。如图

整数划分问题

早过忘川 提交于 2020-03-23 19:56:50
将正整数n表示成一系列正整数之和: n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。 求正整数n的不同划分个数。 例如正整数6有如下11种不同的划分: 6; 5+1; 4+2,4+1+1; 3+3,3+2+1,3+1+1+1; 2+2+2,2+2+1+1,2+1+1+1+1; 1+1+1+1+1+1。 问题本身都具有比较明显的递归关系,因而容易用递归函数直接求解。 如果设p(n)为正整数n的划分数,则难以找到递归关系,因此考虑增加一个自变量:将最大加数n1不大于m的划分个数记作q(n,m)。 #include <iostream> using namespace std; //增加一个自变量m,表示n的最大加数小于等于m int changeToAddtion(int n,int m) { if(n < 1 || m < 1) //此时不是正整数,返回0 { return 0; } if(n == 1 || m == 1) //1的划分只有1中情况 即 1 = 1 { return 1; } if(n < m) //m不可能大于n,m最大也就是n { return changeToAddtion(n,n); } if(n == m) //此时是把n分为 n = n 和最大加数小于n的其他情况 { return 1 + changeToAddtion(n,n-1);

PostgreSQL递归查询示例

半世苍凉 提交于 2020-03-23 18:51:29
PostgreSQL提供了WITH语句,允许你构造用于查询的辅助语句。这些语句通常称为公共表表达式或cte。cte类似于只在查询执行期间存在的临时表。 递归查询是指递归CTE的查询。递归查询在很多情况下都很有用,比如查询组织结构、物料清单等层次数据 下面演示了递归CTE的语法: WITH RECURSIVE cte_name( CTE_query_definition -- non-recursive term UNION [ALL] CTE_query definion -- recursive term ) SELECT * FROM cte_name; 递归CTE有三个元素: 1.非递归项:非递归项是CTE查询定义,它构成CTE结构的基本结果集。 2.递归项:递归项是使用UNION或UNION ALL操作符将一个或多个CTE查询定义与非递归项连接起来。递归项引用CTE名称本身。 3.终止检查:当上一个迭代没有返回任何行时,递归将停止。 PostgreSQL按以下顺序执行递归CTE: 1.执行非递归项来创建基本结果集(R0)。 2.以Ri作为输入执行递归项,返回结果集Ri+1作为输出。 3. 重复步骤2,直到返回一个空集。 (终止检查) 4.返回最终的结果集,它是一个并集,或者是所有结果集R0、R1、……Rn的并集 我们将创建一个新表来演示PostgreSQL递归查询。

Python递归

谁说我不能喝 提交于 2020-03-23 18:47:12
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 def age(n): if n == 1: return 10 # 结束条件 else: return age(n-1) + 2 # 调用函数本身 print(age(5)) 结果: 18 递归的原理 print(data) if len(data)> 1: # 判断当列表的长度大于1的时候,进行二分法递归运算 mid_index=int(len(data)/2) # 取中间的得索引位置 mid_value=data[mid_index] # 中间位置的值 if num < mid_value: # 当输入的值比中间的值小的情况 data = data[:mid_index] # 切片操作,把左侧到索引值的列表重新复制给data search(num,data) # 调用函数本身 elif num > mid_value: #  data = data[mid_index:] search(num,data) else: print("you get it") return # 这是结束条件 else: # 这是当列表的长度是1的时候 if num == data[0]: #现在只有一个元素 print("you get it") else: print("no exits") search

Top K算法

我的未来我决定 提交于 2020-03-23 17:52:10
Top K算法 问题描述 : 从arr[1, n]这n个数中,找出最大的k个数,这就是经典的TopK问题。 栗子 : 从arr[1, 12]={5,3,7,1,8,2,9,4,7,2,6,6} 这n=12个数中,找出最大的k=5个。 一、排序 排序是最容易想到的方法,将n个数排序之后,取出最大的k个,即为所得。 伪代码 : sort(arr, 1, n); return arr[1, k]; 时间复杂度 :O(n*lg(n)) 分析 :明明只需要TopK,却将全局都排序了,这也是这个方法复杂度非常高的原因。那能不能不全局排序,而只局部排序呢?这就引出了第二个优化方法。 二、局部排序 不再全局排序,只对最大的k个排序。 冒泡是一个很常见的排序方法,每冒一个泡,找出最大值,冒k个泡,就得到TopK。 伪代码 : for(i=1 to k){ ​ bubble_find_max(arr,i); } return arr[1, k]; 时间复杂度 :O(n*k) 分析 :冒泡,将全局排序优化为了局部排序,非TopK的元素是不需要排序的,节省了计算资源。不少朋友会想到,需求是TopK,是不是这最大的k个元素也不需要排序呢?这就引出了第三个优化方法。 三、堆 思路 :只找到TopK,不排序TopK。 先用前k个元素生成一个小顶堆,这个小顶堆用于存储,当前最大的k个元素。 接着,从第k

决策树的构建及可视化——帮自己配副隐形眼镜

女生的网名这么多〃 提交于 2020-03-23 12:00:16
前文简介 上一篇文章中主要介绍了以下几方面: 决策树的简介 决策树的流程 熵的定义及如何计算熵 信息增益的定义及如何计算信息增益 依据信息增益划分数据集 本文以一个新的数据集(隐形眼镜数据集)为基础实现构建决策树、决策树的保存与加载、利用决策树分类、决策树的可视化,前文的知识不在过多概述,着重介绍这四个方面。 先大致了解一下数据集: 这份数据源至UCI数据库,其共有4个特征分别为 age (年龄)、 prescript (症状)、 astigmatic (闪光)、 tearRate (泪液产生率)以及一个分类标签 class ,该分类包含硬材质、软材质和不应配带三种。 为了方便处理,对样本做以下处理: age:young—>0、pre—>1、presbyopic—>2 prescript:myope—>0、hyper—>1 astigmatic:no—>0、yes—>1 tearRate:reduced—>0、normal—>1 四、决策树的构建 在构造决策树之前,先回顾一下前几个子模块的工作原理:先获取原始数据集,然后基于最优特征划分数据集,当数据集特征大于两个时,第一次划分之后,数据将被向下传递至树的下一个节点,在这个节点上,在此划分数据,此过程是利用递归原理处理数据集。 什么时候划分结束呢?当程序遍历完所有划分数据集的属性,或者每个分支下所有实例分类一致时代表划分数据集结束。