递归调用

15.python变量,递归

穿精又带淫゛_ 提交于 2019-12-01 11:09:59
# 如果函数的内容有global关键字 # - 有声明局部变量 # NAME = ["产品经理","廖波湿"] # def qupengfei(): # global NAME # NAME = "自己" # print('我要搞', NAME) # qupengfei() # - 错误示例 # NAME = ["产品经理","廖波湿"] # def qupengfei(): # NAME = "自己" # global NAME # print('我要搞', NAME) # qupengfei() # - 无声明局部变量 # NAME = ["产品经理","廖波湿"] # def qupengfei(): # global NAME # NAME = ["阿毛"] # NAME.append('XXOO') # print('我要搞', NAME) # qupengfei() ######## 全局变量变量名大写 ######## 局部变量变量名小写 # 优先读取局部变量,能读取全局变量,无法对全局变量重新赋值 NAME=“fff”, # 但是对于可变类型,可以对内部元素进行操作 # 如果函数中有global关键字,变量本质上就是全局的那个变量,可读取可赋值 NAME=“fff” 函数之间可以进行嵌套 NAME = '海风' def huangwei(): name = "黄伟"

深究递归和迭代的区别、联系、优缺点及实例对比

久未见 提交于 2019-12-01 10:58:05
深究递归和迭代的区别、联系、优缺点及实例对比 1. 概念区分 递归的基本概念 : 程序调用自身的编程技巧称为递归 , 是函数自己调用自己 . 一个函数在其定义中直接或间接调用自身的一种方法 , 它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决 , 可以极大的减少代码量 . 递归的能力在于用有限的语句来定义对象的无限集合 . 使用递归要注意的有两点 : 1) 递归就是在过程或函数里面调用自身 ; 2) 在使用递归时 , 必须有一个明确的递归结束条件 , 称为递归出口 . 递归分为两个阶段 : 1) 递推 : 把复杂的问题的求解推到比原问题简单一些的问题的求解 ; 2) 回归 : 当获得最简单的情况后 , 逐步返回 , 依次得到复杂的解 . 利用递归可以解决很多问题 : 如背包问题 , 汉诺塔问题 ,... 等 . 斐波那契数列为 :0,1,1,2,3,5... 由于递归引起一系列的函数调用 , 并且有可能会有一系列的重复计算 , 递归算法的执行效率相对较低 . 迭代 : 利用变量的原值推算出变量的一个新值 . 如果递归是自己调用自己的话 , 迭代就是 A 不停的调用 B. 2. 辩证看递归和迭代 所谓递归,简而言之就是应用程序自身调用自身,以实现层次数据结构的查询和访问。 递归的使用可以使代码更简洁清晰,可读性更好(对于初学者到不见得),但由于递归需要系统堆栈

Python3基础-递归函数

拈花ヽ惹草 提交于 2019-12-01 10:08:07
递归 1、递归定义:在调用一个函数的过程中直接或间接调用自身本身 #猜中数字的游戏 import random def guess_num(num,guess): if num > guess: print("num 大于 guess,请继续输入") guess = int(input("请输入大于当前guess的数字")) guess_num1=guess_num(num,guess) return guess_num1 elif num < guess: print("num 小于于 guess,请继续输入") guess = int(input("请输入小于当前guess的数字")) guess_num2=guess_num(num,guess) return guess_num2 else: print("猜中了") return guess num = random.randint(0, 100) guess=int(input("请输入1-100的数字")) guess_num1=guess_num(num,guess) print(guess_num1) """ 执行结果 请输入1-100的数字10 num 大于 guess,请继续输入 请输入大于当前guess的数字50 num 大于 guess,请继续输入 请输入大于当前guess的数字60 num 大于

python3 递归函数return返回None

点点圈 提交于 2019-12-01 09:12:17
今天写了一个函数,执行之后打印出来的结果是None,不明白,之后百度了一下,这里记一下过程,免得之后再踩坑 #!/usr/bin/python3# -*- coding:utf-8 -*-def binarysystem_to_decimalsystem(): '''实现二进制转十进制''' binarysystem = input('请输入数据:') decimalsystem_sum = 0 try: binarysystem = float(binarysystem) except ValueError: print('输入错误,请重新输入') binarysystem_to_decimalsystem() else: binarysystem = str(binarysystem) if len(binarysystem.replace('1', '').replace('0', '').replace('.', '')) == 0: binarysystem = binarysystem.split('.') binarysystem_int = binarysystem[0] # 整数部分 binarysystem_int = binarysystem_int[::-1] binarysystem_float = binarysystem[1] # 小数部分 for i

【python】-- GIL锁、线程锁(互斥锁)、递归锁(RLock)

二次信任 提交于 2019-12-01 08:31:37
GIL锁 计算机有4核,代表着同一时间,可以干4个任务。如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的。但是单核永远肯定时串行的,它肯定是串行的,cpu真正执行的时候,因为一会执行1,一会执行2.。。。。正常的线程就是这个样子的。但是,在python中,无论有多少核,永远都是假象。无论是4核,8核,还是16核.......不好意思,同一时间执行的线程只有一个(线程),它就是这个样子的。这个是python的一个开发时候,设计的一个缺陷,所以说python中的线程是假线程。 1、 全局解释器锁(GIL)  无论你启多少个线程,你有多少个cpu, Python在执行的时候会淡定的在同一时刻只允许一个线程运行 2、GIL存在的意义?  因为python的线程是调用操作系统的原生线程,这个原生线程就是C语言写的原生线程。因为python是用C写的,启动的时候就是调用的C语言的接口。因为启动的C语言的远程线程,那它要调这个线程去执行任务就必须知道上下文,所以python要去调C语言的接口的线程,必须要把这个上限问关系传给python,那就变成了一个我在加减的时候要让程序串行才能一次计算。就是先让线程1,再让线程2.......  每个线程在执行的过程中,python解释器是控制不了的,因为是调的C语言的接口,超出了python的控制范围

算法第二章递归与分治策略小结

北战南征 提交于 2019-12-01 08:03:22
第2章 递归与分治策略 2.1.递归的概念 递归算法:直接或间接地调用自身的算法 递归函数:用函数自身给出定义的函数 !!!!递归函数的第一句一定是if语句作为边界条件,然后就是递归方程 如:阶乘函数的第一句就是if条件语句 1 int factorial(int n){ 2 if( n ==0) 3 return 1; 4 return n*factorial(n-1); 5 } ※※※递归函数中比较著名的是Hanoi塔问题 Hanoi塔问题。 设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座c上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则: 规则1:每次只能移动1个圆盘; 规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则3:在满足规则1和2的前提下,可将圆盘移至a,b,c中任一塔座上。 hanoi塔问题题目描述 1 #include<iostream> 2 using namespace std; 3 void move(char p1,char p2){ 4 cout<<p1<<"->"<<p2<<endl; 5 } 6 7 //将a上的n个盘子经b移动到c上 8 void hanoi(int n,char a,char b,char

正确重写hashCode方法

廉价感情. 提交于 2019-12-01 07:47:05
https://blog.csdn.net/HD243608836/article/details/87367763 到这里,对象写完了,开始描述问题。 计算hashCode的注意事项: 1、不能包含equals方法中没有的字段,否则会导致相等的对象可能会有不同的哈希值。 (即对类中每一个重要字段,也就是影响对象的值的字段,也就是equals方法里有比较的字段,进行操作) 2、String对象和Bigdecimal对象已经重写了hashcode方法,这些类型的值可以直接用于重写hashcode方法; 3、result = 31 *result + (dishCode !=null ?dishCode.hashCode() : 0);,这里面为啥用个31来计算,而且很多人都是这么写的,这是因为31是个神奇的数字,任何数n*31都可以被jvm优化为(n<<5)-n,移位和减法的操作效率比乘法的操作效率高很多! 4、 Google 首席Java架构师Joshua Bloch在他的著作《Effective Java》中提出了一种简单通用的hashCode算法: ①初始化一个整形变量,为此变量赋予一个非零的常数值,比如int result = 17; ②如果是对象应用(例如有String类型的字段),如果equals方法中采取递归调用的比较方式

day 15 内置函数二 递归 lamda sorted filter map 二分法求值

让人想犯罪 __ 提交于 2019-12-01 07:20:15
今日主要内容 1. lambda 匿名函数   语法:      lambda 参数:返回值     不能完成复杂的操作、只能写一行 2. sorted() 函数 排序   sorted(iterable, key =None ,reverse=false)   sorted(可迭代对象,key = None,reverse= False) lst = [1,3,23,6,4,34,23,12,9] lst.sort() #sort是list里面的一个方法 print(lst) sorted(lst) #内置函数,返回给你一个新列表,新列表是被排序的。 (与dic.frokeys())效果一样,   print(lst)   排序.     1. 可迭代对象     2. key=函数. 排序规则     3. reverse. 是否倒序   原理:在sorted内部会将可迭代对象中的每一个元素传递给这个函数key的参数,根据函数的运算结果进行排序。 例如:可以进行列表中字符串的长度排序 3. filter() 函数 过滤   filter(function,iterable) 处理完后是一个 迭代器   原理:把可迭代对象中的每一个元素传递给function,然后根据function返回的True或者False来判断是否保留此数据     1. 函数, 返回True或False

第二章算法总结

孤者浪人 提交于 2019-12-01 07:15:50
递归的概念:直接或者间接地调用自身的算法称为递归算法。 递归让一些复杂的问题变得简单易懂易于分析,如汉诺塔问题和Ackerman函数,在排序快排算法和归并排序算法中也有递归的运用。 汉诺塔: ackerman函数: 递归的缺点:需要不断开拓堆栈空间,占用空间大,可能导致内存溢出,并且运行效率低,不能记录已经计算过的结果,和动态规划比速度慢。 分治法的基本思想: 分治法将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。递归地解决这些子问题,然后将各个子问题的解合并得到原问题的解 一般的设算法设计模式 void 分支法(P问题){   设置问题边界   if(P 小于等于最小问题规模)     调用解决最小规模的方法   将P问题分成k分   for( i : 1 -> k) {     yi = 分支法(pi)   }   return 合并(y1 -> yk) } 分治算法复杂度分析:https://www.cnblogs.com/MarcusJr19/p/11661392.html (以获得作者同意进行转载) 补充 T(n) = aT(n/b) + O(n^d) a:分成a个子问题 b:将问题规模变为n/b d:分解和合并a个子问题的时间复杂度为O(n^d) 分治法的核心是找到与原问题相同的子问题

python函数 | 递归函数

北慕城南 提交于 2019-12-01 07:05:49
递归函数:在一个函数中,调用这个函数本身。递归的默认最大深度为998。 它是执行到多少次时,报错呢 ? 加一个计数器。默认递归深度为998 count = 0 def func1(): global count count += 1 print(count) func1() func1() 递归深度是可以改的 import sys sys.setrecursionlimit(100000) #更改默认递归深度 count = 0 def func1(): global count count += 1 print(count) func1() func1() 问年龄 def func(n): if n == 1: return 18 else: return func(n-1) +2 print(func(4)) # 24 来源: https://www.cnblogs.com/Summer-skr--blog/p/11664212.html