递归调用

四数之和之递归思路

我与影子孤独终老i 提交于 2019-12-04 16:51:24
  在leetcode刷到两数之和、三数之和、四数之和的问题,发现题解都在使用滑动窗口、双指针的方法,在此补充一下递归与递推的解题思路(因为我的解题思路都是思考解空间-遍历解空间-聪明的遍历解空间-发现方法到达优化瓶颈,再思考其它方式如双指针、hash等,对递归和递推总有执念)。   注:递归解法往往效率不高,本文仅是给出以递归的思路思考问题的过程以供参考,并不是题目的最优解法。   已中间的四数之和为例,我们先看题目:     题目中不难发现,问题本身是带有递归结构的。可以用递归解决的问题大致包含以下三类:   (1)多重循环(递归层数不确定):N皇后问题   (2)本身用递归形式定义的问题:阶乘、波兰表达式   (3)将问题分解成规模更小的子问题:汉诺塔   我们在定义函数时,如果确定了问题具有递归结构,只需考虑回归条件和每一层与下层的关系, 状态转移方程就是描述相邻层级间关系的函数,即如何用小问题的解来解决相邻层级的高层问题 。我们定义函数f(x,target)为输出目标数组中x个和为target的元素,那么,f(4)与f(3)的关系为:      f(3)与f(2)的关系为:   f(n)与f(n-1)的关系为:      将状态转移方程用伪代码描述(不太喜欢内嵌代码的风格,完整代码在文末提供):      状态转移方程有了,我们还需要思考一下递归的回归条件

匿名函数,内置函数,函数递归,模块

六月ゝ 毕业季﹏ 提交于 2019-12-04 13:55:39
匿名函数 1.什么是匿名函数(lambda) 无名字的函数 :冒号左边是参数, 右边是返回值 关键字:lambda : PS: 原因,因为没有名字,函数的调用 函数名 + () 即lambda : 匿名函数需要一次性使用。 注意: 匿名函数单独使用毫无意义, 它必须配合 “内置函数” 一起使用的才有意义。 func = lambda : 1 print(func()) # 匿名函数单独使用毫无意义,因为没有函数名,所以需要赋值给其他变量名 内置函数 1.什么是内置函数 python提前内置的函数 range() # 算是一个生成器print() # 打印返回值len() # 检查序列长度max() # 输出最大值min() # 输出最小值sorted # 默认reverse是False,对可迭代对象从小到大排序mapfiltersorted: 内置函数和匿名函数相结合dict1 = { 'tank': 100, 'egon': 500, 'sean': 200, 'jason': 50}# 先遍历dict1里面的值,因为是字典,索引会遍历key,将其赋值x,再通过索引key得到value给sorted排序,最好输出keynew_dict = sorted(dict1,key = lambda x:dict1[x],reverse=True) print(new_dict)​

函数递归

邮差的信 提交于 2019-12-04 13:53:24
函数递归: 函数递归指的是重复 “直接调用或间接调用” 函数本身, 这是一种函数嵌套调用的表现形式。 直接调用: 指的是在函数内置,直接调用函数本身。 间接调用: 两个函数之间相互调用间接造成递归。 了解: python中有递归默认深度: 限制递归次数 998, 1000 PS: 但是在每一台操作系统中都会根据硬盘来设置默认递归深度。 获取递归深度: 了解 sys.getrecursionlimit() 设置递归深度: 了解 sys.setrecursionlimit(深度值) 注意: 单纯的递归调用时没有任何意义的。 想要递归有意义,必须遵循两个条件: - 回溯: 指的是重复地执行, 每一次执行都要拿到一个更接近于结果的结果, 回溯必要有一个终止条件。 - 递推: 当回溯找到一个终止条件后,开始一步一步往上递推。 age5 == age4 + 2 age4 == age3 + 2 age3 == age2 + 2 age2 == age1 + 2 age1 == 18 # 回溯终止的结果 # result = age(n - 1) + 2 ''' def age(n): if n == 1: return 18 # 这里写return才能实现递推 return age(n - 1) + 2 res = age(5) print(res) # 26 来源: https://www

内置函数,递归函数,模块与包,开发目录规范

淺唱寂寞╮ 提交于 2019-12-04 13:52:04
内置函数 max()函数: salaries={ 'egon':3000, 'alex':100000000, 'wupeiqi':10000, 'yuanhao':2000 } res = max (salaries,key=lambda x :salaries[x]) print(res) salaries_and_name = zip(salaries.values(),salaries.keys())#把数字放前边 print(max(salaries_and_name)) map 映射 :会将迭代对象的每一个值进行修改,然后映射一个map对象中,再转化成列表或元组,但是只能转化一次 函数内部也可以进行判断,但是映射返回值为None l = ['a','b','c','d','e'] res = map(lambda x :x+'BB' ,l) res2 = map(lambda x :x+'BB' if x=='b'else None,l) print(list(res)) print(list(res2)) filter 过滤, 将函数中返回结果为Ture的参数值过滤出来,但是能对参数进行修改 l2 = [1,2,3,4,5,6,7,8] res = filter(lambda x :x if x >4 else None, l2) print(list(res))

python基础-函数递归

房东的猫 提交于 2019-12-04 13:48:41
函数递归 概念 :直接或间接地重复调用函数本身,是一种函数嵌套调用的表现形式。 直接调用 :在函数内部,直接调用函数本身 def foo(): print("这是foo函数") foo() foo() # 进入死循环 间接调用 :两个函数之间相互调用间接造成递归 def a_func(): print("这是a_func函数") b_func() def b_func(): print("这是b_func函数") a_func() a_func() 话说,大家千万不要执行以上代码!!!!电脑配置不好,宕机了的,不要来找我!以上两个例子都陷入了死循环。而这确实是递归!重点来了! 单纯递归调用时,没有任何意义 如果想要有意义,必须遵循两个条件: 回溯:重复地执行, 每一次执行都要拿到一个更接近结果的结果 。回溯必须要有一个 明确的终止条件 。 递推: 当回溯找到一个终止条件 后,开始一步一步往上递推。 def age(n): if n == 1: return 18 # 此处必须写上return 才能实现递推 return age(n - 1) + 2 print(age(5)) 扩展 递归的经典案例习题 1、递归求阶乘 1!+2!+3!+4!+5!+...+n! 2、使用递归打印斐波那契数列,(前两个数的和得到第三个数,如:0 1 1 2 3 5 8...) 3、一个嵌套很多层的列表

python基础语法10 函数递归,模块,软件开发目录规范

扶醉桌前 提交于 2019-12-04 13:45:19
函数递归:   函数递归指的是重复 “直接调用或间接调用” 函数本身,   这是一种函数嵌套调用的表现形式。   直接调用: 指的是在函数内置,直接调用函数本身。   间接调用: 两个函数之间相互调用间接造成递归。   了解:     面试可能会问:       python中有 递归默认深度 : 限制递归次数        998 , 1000       PS: 但是在每一台操作系统中都会根据硬盘来设置默认递归深度。     获取递归深度: 了解       sys.getrecursionlimit()     设置递归深度: 了解       sys.setrecursionlimit(深度值) 注意: 单纯的递归调用时没有任何意义的。 def func(): #自己调用自己,死循环,默认998 print('from func') func() func() ------------------------------------------------- import sys # 获取操作系统资源的模块 print(sys.getrecursionlimit()) #获取当前递归深度限制 sys.setrecursionlimit(2000) #设置当前递归深度限制 # 查看当前可以承受的递归深度 num = 1 def func(): global num print

函数补充与模块

喜欢而已 提交于 2019-12-04 13:24:49
内置函数补充: map:映射 map(func, 可迭代对象)---->map对象 map会将可迭代对象中的每一个值进行修改,然后映射在一个map对象中,可以再将map对象转换成列表/元组, 需要注意的是只能转一次(原因是取一次后生成器就被取完了) #map 映射 name_list = ['egon', 'jason', 'sean', '大饼', 'tank'] map_obj = map(lambda x:x+'_dsb' if x != 'tank' else x+'喜欢吃生蚝', name_list) print(map_obj) #map_obj可以变成list/tuple类型 print(list(map_obj)) #map_obj---->生成器(迭代器)----》用完后,不能再取了 print(tuple(map_obj)) reduce:合并 在使用时首先需要调用reduce模块 from functools import reduce 每次从可迭代对象中获取两个值进行合并,执行reduce函数都是从初始值开始合并 reduce(函数地址, 可迭代对象,初始值(默认是0)) #reduce 合并 from functools import reduce print(reduce(lambda x, y: x+y, range(1, 101), 0)) 结果:

Java基础-File类篇、递归篇

前提是你 提交于 2019-12-04 11:02:57
1. File类 1.1 File类介绍 ​ java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。 1.2 构造方法 语法 public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。 public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。 代码 // 创建File对象-方式1 File file1 = new File("D:\\JavaCode\\BasicCode\\a"); System.out.println(file1); // 创建File对象-方式2 File file2 = new File("D:\\JavaCode\\BasicCode\\a","1.txt"); System.out.println(file2); // 创建File对象-方式3 File file3 = new File(file1,"1.txt"); System.out.println(file3); 注意事项

Java基础-File类篇、递归篇

断了今生、忘了曾经 提交于 2019-12-04 11:01:08
1. File类 1.1 File类介绍 ​ java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。 1.2 构造方法 语法 public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。 public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。 代码 // 创建File对象-方式1 File file1 = new File("D:\\JavaCode\\BasicCode\\a"); System.out.println(file1); // 创建File对象-方式2 File file2 = new File("D:\\JavaCode\\BasicCode\\a","1.txt"); System.out.println(file2); // 创建File对象-方式3 File file3 = new File(file1,"1.txt"); System.out.println(file3); 注意事项

python中的函数递归和迭代问题

倖福魔咒の 提交于 2019-12-04 09:26:54
一、递归 1、递归的介绍 什么是递归?    程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法, 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量 。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。   递归要注意的是,它是直接或间接调用自身,所以在使用递归时,必须有一个明确的递归结束条件,称为递归出口,否则,他就会陷入死循环。 尾递归   具体可以看一下博客 https://blog.csdn.net/ialexanderi/article/details/81482878   如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。 python不是一门函数式编程语言,本身不支持尾递归(没有对尾递归做优化)