递归调用

八皇后,回溯与递归(Python实现)

柔情痞子 提交于 2019-12-02 15:05:08
八皇后,回溯与递归(Python实现) 八皇后问题是十九世纪著名的数学家高斯1850年提出 。以下为python语言的八皇后代码,摘自《Python基础教程》,代码相对于其他语言,来得短小且一次性可以打印出92种结果。同时可以扩展为九皇后,十皇后问题。 问题:在一个 8*8 棋盘上,每一行放置一个皇后旗子,且它们不冲突。冲突定义:同一列不能有两个皇后,每一个对角线也不能有两个皇后。当然,三个皇后也是不行的,四个也是不行的,凭你的智商应该可以理解吧。 解决方案:回溯与递归。 介绍: 1.回溯法 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。参见 百度百科 2.递归法 阶乘 n! = 1 x 2 x 3 x ... x n 用函数 fact(n) 表示,可以看出: fact(1) = 1 fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n 于是, fact(n) 用递归的方式写出来就是: def fact(n): if n==1: return 1 return n * fact(n - 1) 如果计算 fact(5) ,结果如下: ==

ACM算法笔记

▼魔方 西西 提交于 2019-12-02 12:32:18
HNU君陌 此笔记为本人在准备ACM校赛时阅读资料所整理的总结心得,适合入门级的同学,仅供参考: 第一部分语言 第一章程序设计入门 1.1算术表达式 整数型用printf()时为%d,实数用%f输出,保留一位n数为printf(“%.nf”, ) 1.2变量及其输入 整数型用scanf()时为%d,实数用%lf输入,%5d表示按5位数打印,%05d表示按5位数表示,不足补0。 占位符和变量的数据类型一一对应,且每个变量前均需要加”&”符号。 竞赛时,选手程序的执行是自动完成的,没有人工干预,不需要界面友好。也不要让程序按任意键退出:system(“pause”)或添加一个多余的getchar() 不要在竞赛中使用getch()、getche()、gotoxy()、clracr()函数 在算法竞赛中,每行输出均应以回车符结束,包括最后一行,除非特别说明,每行的行首不应有空格,但行末可以有多余空格。另外,输出的每两个数或者字符串之间应以单个空格隔开。即算法竞赛的程序制作三件事:读入数据,计算结果,打印输出 1.3变量交换 三变量法: t=a; a=b; b=t; 单变量法(只有定义了加减法的数据类型才可以): a=a+b; b=a-b; a=a-b; 1.4分支结构程序设计 第二章循环结构设计 2.1 for循环 尽量缩短变量的定义范围。 浮点运算可能存在误差,在进行浮点数比较的时候

第二模块 3.8 函数的递归

我们两清 提交于 2019-12-02 12:26:10
举例: 求100不断除以2直到商为0为止,打印每次除的商 n = 100 while n >0: n = int(n/2) print(n) 用递归函数表示: def calc(n): n = int(n/2) print(n) if n >0: calc(n) calc(100) 如果一个函数在内部调用自已本身,这个函数就叫做递归函数。上面我们写的这个代码就是递归 def calc(n): n = int(n/2) print(n) if n >0: calc(n) print(n) calc(100) 递归特性: 必须有一个明确的结束条件 每次进入更深一层递归时,问题规模相比上次递归都应有所减少 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出) 练习题 用递归实现2分查找的算法,以从列表 a = [1,3,4,6,7,8,9,11,15,17,19,21,22,25,29,33,38,69,107] 查找指定的值。 a = [1,3,4,6,7,8,9,11,15,17,19,21,22,25,29,33,38,69,107] def binary_search(start, end, n

递归函数

孤街醉人 提交于 2019-12-02 12:00:34
递归函数实在一个函数通过名字调用自身的情况下构成的。 1 window.onload = function () { 2 var a = factorial; 3 factorial = null ; 4 alert(a(4 )); 5 }; 6 7 /* * 8 * 叠乘 9 * @param {叠乘的基数} num n 10 * @return {叠乘结果} n*(n-1)*(n-2)*...*1 11 */ 12 var factorial = ( function f(num){ 13 if (num <= 1 ) { 14 return 1 ; 15 } else { 16 return num * f(num - 1 ); 17 } 18 }); 这里使用的是命名函数表达式的方法实现递归,将这个函数赋值给 factorial 。这样即使在使用过程中对变量进行修改,也不会影响已赋值的递归函数进行调用,保证了代码的安全性。这种方式在严格模式和非严格模式下都适用。 更多专业前端知识,请上 【猿2048】www.mk2048.com 来源: https://blog.csdn.net/weixin_39037804/article/details/102759005

递归

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-02 11:44:12
什么是递归呢?    一个函数在内部调用函数自身   每次调用都将问题转化为子问题来执行 废话不多说, 上实例: 以相反的顺序打印字符串 def revers(index, str): if index >= len(str): return revers(index + 1, str) print(str[index]) revers(0, 'abcde') 反转列表: 不开辟新列表的情况下 def revers(index=0, alist): if index >= len(alist): return alist ele = alist.pop() alist.insert(index, ele) revers(index+1, alist) 给定一个链表, 交换每两个相邻节点 如 1, 2, 3, 4 -> 2, 1, 4, 3 class Node(): def __init__(self, item): self.item = item self.next = None class Link(): def __init__(self): self.head = None def add(self, item): node = Node(item) if not self.head: self.head = node return cur = self.head

《剑指offer》树专题 (牛客10.25)

╄→尐↘猪︶ㄣ 提交于 2019-12-02 11:40:54
考察的知识点主要在于树的数据结构(BST,AVL)、遍历方式(前序,中序,后序,层次)、遍历算法(DFS,BFS,回溯)以及遍历时借助的数据结构如队列和栈。由于树本身就是一个递归定义的结构,所以在递归求解问题时,要善于将问题转化成合适的子问题,思考清楚子问题的形式、递归的出口、父问题与子问题的联系。 以下这些问题难度都不太大,很多都是一次过,比上次链表专题的思维难度小多了。 难度 题目 知识点 04. 重建二叉树 依据前序和中序遍历重建 , 递归 ★★ 17. 树的子结构 递归 18. 二叉树的镜像 简单递归 22. 从上往下打印二叉树 bfs , Queue的使用 23. 判断是否为二叉搜索树的后序遍历序列 BST , 递归 ★ 24. 二叉树中和为某一值的路径 dfs , 回溯 , Collections.sort() ★★ 26. 二叉搜索树与双向链表 递归 中序遍历 ★ 38. 二叉树的深度 递归 39. 平衡二叉树 平衡二叉树 递归 57. 二叉树的下一个结点 中序遍历 循环 回溯后的情况 58. 对称的二叉树 递归 可转化为非递归 59. 按之字形顺序打印二叉树 Stack 层次遍历变形 60. 把二叉树打印成多行 Queue LinkedList 层次遍历 ★★ 61. 序列化二叉树 递归 string.split() string.equals 62.

递归函数

大憨熊 提交于 2019-12-02 11:05:48
按alt+回车 自动导入模块 变量显示灰色,表示定义了没使用 #递归,函数自己调用自己,递归最多循环999次 def func(): num=input('num:') if num %2==0: print('偶数') return else: func() #lambda #匿名函数,只能写简单的函数,简单函数不用写def定义了 # f1=lambda x:x+1 #前端x是入参,x+1是返回值 # def f1(x): # return x+1 f2=lambda a,b:a+b result=list(map(lambda x:str(x).zfill(2),range(1,30)))#减少内存 来源: https://blog.csdn.net/comesuh/article/details/102754395

二叉树的递归遍历(java实现)

跟風遠走 提交于 2019-12-02 11:04:30
二叉树的递归遍历(java实现) 二叉树是数据结构中非常重要的一章,而二叉树的遍历是重中之重。本文记载了我构造二叉树并对一棵简单的二叉树进行前、中、后序遍历的经验,因为本人是新手,不足之处还请谅解,欢迎指正。 创建树类 package tree ; public class BinaryTree { TreeNode root ; public BinaryTree ( ) { System . out . println ( "创建一棵树完成" ) ; } //设置根节点 public void setRoot ( TreeNode root ) { this . root = root ; System . out . println ( "在树中成功创建了一个根节点" ) ; } } 创建节点类 package tree ; public class TreeNode { //节点中具有value值,此处声明 int value ; //值的两端是左右节点的引用 TreeNode leftNode ; TreeNode rightNode ; //构造器,在声明一个节点时传值。 public TreeNode ( int value ) { this . value = value ; } //创建一个节点的左节点 public void setLeftNode (

python 递归、匿名函数、

最后都变了- 提交于 2019-12-02 10:58:13
1、递归:就是函数自己调用自己。(注:递归最多循环999) 2、匿名函数(意义:减少内存占用) lambada 定义一个匿名函数,eg:lambad x,b:x+b (:前面是入参eg:x,b,:后面是返回值eg:x+b) eg: def f(x):    return x+1 来源: https://www.cnblogs.com/wangyajuanjuan/p/11742372.html

数据结构与算法应用

喜欢而已 提交于 2019-12-02 10:50:44
16.1 数据结构与算法应用基础 算法灵活度高,不容易拿分,拿部分分6-8分就不错啦 16.2 分治法 往往运用递归解决问题 16.3 分治法(递归技术):必须掌握,不然很多问题难以理解 递归:就是函数在运行的过程中调用自己 为什么调用自己:我们要解决的问题可以才分为多个同类型的子问题,既然函数是用来解决这个复杂问题的,那么函数也可以解决子问题,所以自己调自己。 16.4 分治法具体应用(二分查找) 16.5 回溯法--深度优先 解决经典的迷宫问题 16.6 贪心法(性价比) 每一步都选择最好的东西所以叫贪心法 特色:在短时间找出解,但不一定是最优解 16.7 动态规划法(在逻辑方面非常复杂) 分治法与动态的区别: 动:子问题的解与原问题可能有关联,将子问题的解存在一个表中 动态规划法会构造出一个表去 查表 16.8 数据结构与算法应用分析1 解题思路:先解决其他方面的问题,再解决代码问题,有促进作用 16.9 案例2 来源: https://blog.csdn.net/shujuku____/article/details/102752858