递归算法

算法学习笔记(三)------递归之N皇后

折月煮酒 提交于 2019-12-07 04:45:03
通过上一次的学习可以知道,如果要实现一个递归函数,那么必须要有两个东西。———— 递归边界 和 递归式 。 递归边界 用于返回最简单的底层的结果。 递归式 用于减小数据规模并向下一层递归。 其实学到这里才发现,递归才是计算机思维,虽然说起来简单,但是正常人的思维模式是不按照递归走的。 今天要研究的是 N皇后问题 ,是回溯算法的典型题,于19世纪被提出。 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。 也就是输入整数N(这里是八),求出N个国际象棋在N*N的棋盘上的位置。 #include<iostream> #include<cmath> using namespace std ; int N; int queenPos[ 100 ]; //用来存放算好的皇后位置,最左上角为(0,0) void NQueen( int k) //在0--k-1行皇后已经摆好的情况下,推算k行及以上的摆法 { int i; if (k == N){ //N个皇后已经摆好 for (i= 0 ;i<N;i++) cout <<queenPos[i]+ 1 << " " ; cout <<endl; return ; } for (i= 0 ;i<N;i++

数据结构复习————递归与栈

拈花ヽ惹草 提交于 2019-12-07 04:43:39
递归的定义: 若一个对象部分的包括它自己,或用它自己给自己定义,则称这个对象是递归的,递归也可定义为,在一个过程中直接或间接的调用自己,则这个过程也是递归的。 能采用递归算法的问题的特征: 当一个问题具有以下三个特征时,就可以用递归算法。 1)大问题能分解成若干个子问; 2)子问题或是一个定值(直接解),或是与大问题具有相同性质的问题仅仅是规模比大问题小,即被定义项在定义中应具有更小的尺度; 3)子问题在最小尺度上有直接解,即分解过程能最终能结束(递归有结束条件)。 举个列子,比方说求n!(n为自然数)。正常人为的求解可能是1x2x3x—(n-1)xn。但这个问题可以分为两种情况考虑: (1)当n=0时,n!=1 (2)当n>0时,n!=nx(n-1)! 再对照上述的三个条件,n!分为一个子问题n(为一个定值),和另一个规模比n!小的问题(n-1)!满足1),2)两个条件。再者(n-1)!可以继续分:(n-1)!=(n-1)x(n-2)!=(n-1)x(n-2)x(n-3)!=—,—x2x1!。而1!就等于1,所以子问题在最小尺度上有直接解,满足条件3)。其递归函数如下所示: int fact( int n){ if (n== 0 ) /*递归结束条件*/ return 1 ; else return (n*fact(n- 1 )); } 递归与栈的关系: 那么就产生问题呢

Contest100000583 - 《算法笔记》4.3小节——算法初步->递归

那年仲夏 提交于 2019-12-07 04:43:27
文章目录 Contest100000583 - 《算法笔记》4.3小节——算法初步->递归 4.3 递归 4.3.1 分治 4.3.2 递归 递归求解n的阶乘 求斐波那契(Fibonacci)数列的第n项 全排列 n皇后问题 练习 Contest100000583 - 《算法笔记》4.3小节——算法初步->递归 1907 Problem A 吃糖果 2018 Problem B 数列 2044 Problem C 神奇的口袋 2046 Problem D 八皇后 总结下: Contest100000583 - 《算法笔记》4.3小节——算法初步->递归 4.3 递归 4.3.1 分治 4.3.2 递归 递归求解n的阶乘 //递归求解n的阶乘 #include < cstdio > int F ( int n ) { if ( n == 0 ) return 1 ; //递归边界 else return F ( n - 1 ) * n ; //递归表达式 } int main ( ) { int n ; scanf ( "%d" , & n ) ; printf ( "%d\n" , F ( n ) ) ; return 0 ; } 递归过程如图 求斐波那契(Fibonacci)数列的第n项 //求斐波那契(Fibonacci)数列的第n项 #include < iostream >

一文教你学会递归解题

↘锁芯ラ 提交于 2019-12-06 23:48:32
前言 递归是算法中一种非常重要的思想,应用也很广,小到阶乘,再在工作中用到的比如统计文件夹大小,大到 Google 的 PageRank 算法都能看到,也是面试官很喜欢的考点 最近看了不少递归的文章,收获不小,不过我发现大部分网上的讲递归的文章都不太全面,主要的问题在于解题后大部分都没有给出相应的时间/空间复杂度,而时间/空间复杂度是算法的重要考量!递归算法的时间复杂度普遍比较难(需要用到归纳法等),换句话说,如果能解决递归的算法复杂度,其他算法题题的时间复杂度也基本不在话下。另外,递归算法的时间复杂度不少是不能接受的,如果发现算出的时间复杂度过大,则需要转换思路,看下是否有更好的解法 ,这才是根本目的,不要为了递归而递归! 本文试图从以下几个方面来讲解递归 什么是递归? 递归算法通用解决思路 实战演练(从初级到高阶) 力争让大家对递归的认知能上一个新台阶,特别会对递归的精华:时间复杂度作详细剖析,会给大家总结一套很通用的求解递归时间复杂度的套路,相信你看完肯定会有收获 什么是递归 简单地说,就是如果在函数中存在着调用函数本身的情况,这种现象就叫递归。 以阶乘函数为例,如下, 在 factorial 函数中存在着 factorial(n - 1) 的调用,所以此函数是递归函数 public int factorial(int n) { if (n < =1) { return 1;

资深安卓程序员带你用另一种角度学习 View 事件分发!

丶灬走出姿态 提交于 2019-12-06 21:09:20
我无法忘却 3 年前备受折磨的那个夜晚 —— 在我第一次学习 View 事件分发,却被网文折磨的那个夜晚。 是网上介绍 View 事件分发的文章不够多吗? 不是的,恰恰相反,网上的爆款文章不计其数,待你仔细阅读,却 颇有一种“外地人上了黑车”的感觉 —— 一言不合先上 30 张图表,带你在城市外围饶个上百圈,就是不直奔主题 解释一个现象为什么会存在、造成它存在的缘由为何、它如此设计是为了解决什么问题 …… 比起 拨开迷雾、明确状况、建立感性认识,他们更热衷于自我包装。 —— 有没有帮助我不管,先唬住人再说。 为了唬人,就算给他人徒添困扰、白费大量时间,也在所不惜! 正是对那次痛苦经历的念念不忘,于是我将这篇文章分享给大家。 在此,我向 3 年前的那个自己发誓,我必在 结尾 200 字 就讲明白,别人非要绕个 3000、5000 字都讲不明白的事件分发。 不仅如此,我还要额外地帮助大家理解,事件分发流程中的 3 个小细节:之所以如此设计,是出于什么考虑。通过“知其所以然”,来方便大家更好地加深印象。 还没阅读的小伙伴也请不要着急,正因为今天讲的是基础,光是看了这一篇,你也没白来! View 事件分发的本质是递归! 什么是递归呢?递归的本质是什么呢? 顾名思义,递归是一种包含 “递” 流程和 “归” 流程的算法。当我们在找寻目标时,便是处于 “递” 流程,当我们找到目标

C语言 递归实现辗转相除法

萝らか妹 提交于 2019-12-06 16:37:16
辗转相除法可以用来计算两个数之间的最大公约数,也成为欧几里得算法 算法大致: 在B等于0之前,交换AB位置让V等于上一轮A求余B的结果,当B为0时,A就是最大公约数 代码实现 int gcd(int a, int b){ if (b == 0) { return a; } gcd(b, a % b); } int main() { printf("%d", gcd(12, 18)); return 0; } 打印输出 6 每轮数字变化 12 18 18 12 12 6 6 0 此时,B == 0, 于是结果为A的值6 来源: https://www.cnblogs.com/esrevinud/p/11994701.html

python 之 递归

£可爱£侵袭症+ 提交于 2019-12-06 14:50:16
注: 参考: https://www.runoob.com/python3/python3-examples.html 参考: 《算法图解》 环境: Visual Code Python2.7 阶乘 # -*- coding:UTF-8 -*- #!/usr/bin/env python import sys import math ''' 设置递归深度,否则在递归阶乘1000时,会报错: python maximum recursion depth exceeded(超过python递归深度) ''' sys.setrecursionlimit(2000) # 递归阶乘 def Recursion_factorial(num): if num > 1: return num * Recursion_factorial(num - 1) return 1 # python数学库 def Math_factorial(num): return math.factorial(num) if __name__ == '__main__': selectIndex = input(u'请选择计算的方式(1-递归 2-数学库):'.encode('gbk')) num = input(u'请输入数字:'.encode('gbk')) if selectIndex == 1: result =

递归算法

为君一笑 提交于 2019-12-06 14:13:41
写递归函数,一定要先想好递归的终止条件,以及递归函数内需要做什么。 终止条件:p节点和q节点都为空或者两者之一为空,或者两者值不等 再次比较p节点和q节点的左孩子,以及比较p节点和q节点的右孩子 来源: https://www.cnblogs.com/xxswkl/p/11988738.html

第【7】章: 数递归、DFS、剪枝、回溯等问题 学习报告

风流意气都作罢 提交于 2019-12-06 12:25:30
(7.2 )节: 递归问题 1.题干: 递归方便表达,但是性能上消耗过多 1、有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶、3阶。 请实现一个方法,计算小孩有多少种上楼的方式。 为了防止溢出,请将结果Mod 1000000007 给定一个正整数int n,请返回一个数,代表上楼的方式数。 保证n小于等于100000。 1、关键代码1: int k2(int n) {int rte=0; if(n==1) return 1; if(n==2) return 2; if(n==3) return 4; return (k2(n-1)+k2(n-2)+k2(n-3))%1000000007; } 关键代码2: int k2(int n) { int a[n+2]; int k; a[0]=0;a[1]=1;a[2]=2;a[3]=4; if(n==0) k=0; else if(n==1) k=1; else if(n==2) k=2; else if(n==3) k=4; else for(int i=n;i<=n;i++) {a[i]=(a[i-1]% 1000000007+a[i-2]% 1000000007+a[i-3])%1000000007; k=a[i]; } return k; } 关键代码3: int k2(int n) {int k=0; if(n=

Python进阶-Ⅸ 递归 二分法

烈酒焚心 提交于 2019-12-06 10:54:52
1、算法 英文名:algorithm,就是计算的方法。# 是截止到目前,人类发现的针对特定场景的,最优的计算方法。是人类智慧的结晶。# 人脑是复杂的,电脑其实很简单。比如:999 * 123 人类会将其变为: 1000 * 123 - 123 这样就好算多了,可是电脑不会如此,只会硬算! 学习算法的目的# 我们学习的算法 都是过去时# 了解基础的算法 才能创造出更好的算法# 不是所有的事情都能套用现成的方法解决的# 有些时候会用到学过的算法知识来解决新的问题 2、递归 1)、楔子 有如下例子:从前有座山,山上有个庙;庙里有两个和尚,一个老和尚跟一个小和尚。一天,老和尚跟小和尚讲故事:"从前有座山,山上有个庙;庙里有两个和尚,一个老和尚跟一个小和尚。一天,老和尚跟小和尚讲故事:'从前有座山,山上有个庙;庙里有两个和尚,一个老和尚跟一个小和尚。一天,老和尚跟小和尚讲故事:............................. # 看到这个例子,有何感想?这不是车轱辘话码,自己说自己!# 这就对了,我们就正式引入递归! 2)、递归函数的定义 在函数中,自己调用自己的函数,叫递归函数。 1 depth = 0 2 def temple_story(): 3 global depth 4 print('从前有座山,山上有个庙;庙里有两个和尚,一个老和尚跟一个小和尚。一天