递归算法

六.递归函数

浪尽此生 提交于 2019-11-30 13:52:29
楔子 在讲今天的内容之前,我们先来讲一个故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢......这个故事你们不喊停我能讲一天!我们说,生活中的例子也能被写成程序,刚刚这个故事,让你们写,你们怎么写呀? while True: story = " 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? " print(story) 你肯定是要这么写的,但是,现在我们已经学了函数了,什么东西都要放到函数里去调用、执行。于是你肯定会说,我就这么写: def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? """ print(s) while True: story() 但是大家来看看,我是怎么写的! def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? """ print(s) story() story() 先不管函数最后的报错,除了报错之外,我们能看的出来,这一段代码和上面的代码执行效果是一样的。 返回顶部 初识递归 递归的定义—— 在一个函数里再调用这个函数本身

递归函数的使用

房东的猫 提交于 2019-11-30 13:35:53
一,概念 直接或间接地调用自身的算法称为 递归算法 。 用函数自身给出定义的函数称为 递归函数 。 二,实例 实例1 : 阶乘函数 。 通过分析可知,要求一个数的阶乘,只要知道它前一位数的阶乘便可求出。 即: n!=n*(n-1)! 而要求前一位数的阶乘,只要知道它前前一位数的阶乘即可,即 :(n-1)!=(n-1)*(n-2)!, 因为每次 计算的方式都相同,所以考虑用递归的方式求解。 递归关系:f(n)=n*f(n-1) 递归结束条件:n=1 (因为我们很容易知道1阶乘是1,因此求解其他数的阶乘时,可从1的阶乘开始求起) 代码实现 : 1 import java.util.*; 2 public class HW8 { 3 public static void main(String[] args) { 4 Scanner in=new Scanner(System.in); 5 System.out.println("请输入所要求的数值:"); 6 int n=in.nextInt(); //输入所要遍历的数 7 int number=funtion(n); 8 System.out.println(n+"的阶乘为:"+number); 9 10 } 11 12 /** 13 * 求第n个数的阶乘!!! 14 * @param n 所要求的数的值 15 * @return

软件工程实践2019第三次作业

主宰稳场 提交于 2019-11-30 12:37:07
软件工程实践2019第三次作业 1.Github项目地址 https://github.com/s031702143/031702143 2.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) Planning 计划 30 Estimate 估计这个任务需要多少时间 60 Development 开发 240 Analysis 需求分析 (包括学习新技术) 60 Design Spec 生成设计文档 60 Design Review 设计复审 30 Coding Standard 代码规范 (为目前的开发制定合适的规范) 60 Design 具体设计 120 Coding 具体编码 60 Code Review 代码复审 120 Test 测试(自我测试,修改代码,提交修改) 120 Reporting 报告 30 Test Repor 测试报告 30 Size Measurement 计算工作量 30 Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 15 合计 1065 3.思路描述 按照平时玩数独的过程来进行求解,即根据游戏规则来完成。a[i][j]同一行同一列同一块若出现了x,则这一块不填x。直到所有宫格填完为止。 可以只根据这样的思路简单的构造函数

二叉树的遍历算法

大城市里の小女人 提交于 2019-11-30 12:05:43
遍历(Traverse) 就是按照某种次序访问树中的所有结点,且每个结点恰好访问一次 也就是说,按照被访问的次序,可以得到由树中所有结点排成的一个序列 树的遍历也可以看成是人为的将非线性结构线性化 这里的“访问”是广义的,可以是对结点作各种处理,例如输出结点信息、更新结点信息等 在我们的现实中,并不真正的“访问”这些结点,而是得到一个结点的线性序列,以线性表的形式输出 将整个二叉树看做三部分:根、左子树、右子树。如果规定先遍历左子树、在遍历右子树,那么根据根的遍历顺序就有三种遍历方式: 左子树 右子树 根 先序/根遍历DLR:根 左子树 右子树 中序/根遍历LDR:左子树 根 右子树 后序/根遍历LRD:左子树 右子树 根 注意:由于树的递归定义,其实对三种遍历的概念其实也是一个递归的描述过程 先序/根遍历DLR:1 4 5 2 3 6 7 中序/根遍历LDR:4 5 1 3 2 6 7 后序/根遍历LRD:5 4 3 7 6 2 1 如果按层次遍历,没有递归 面试题:已知一棵二叉树的后序遍历的序列为5 4 3 7 6 2 1,中序遍历的序列为4 5 1 3 2 6 7,则其先序遍历的序列是什么? 只要给定中序遍历,先序遍历或者后序遍历再给一个,就可以求出另一个 后序遍历最后肯定是根,所以确定1是根 所以4 5是左子树,3 2 6 7是右子树 依此类推 /** *二叉链表的结点 *

递归判断回文

本秂侑毒 提交于 2019-11-30 10:06:00
题目介绍: “回文”是指正着读、反着读都一样的句子。比如“我是谁是我”使用递归算法检测回文的算法描述如下: A single or zero-character string is a palindrome.Any other string is a palindrome if the first and last characters are t he same, and the string that remains, excepting those characters, is a palindrome. 设计思想: 1.判断字符串长度(n),当字符串长度为0跟1时即是回文。 2.若与1不符,则我们需要对字符串进行递归判断,即拿第(n-1)个字符,第a(length-n)个字符进行比较,若相同则n-1,再比较,如此循环往复,就会出现一个结束点。 3.结束点就是当n为0或为1,若这样即是回文。 4.递归进行的条件是:若第(n-1)个字符,第a(length-n)个字符相同,则将字符串长度-1,若不满足,则直接退出。 代码如下 package javatask; import java.util.Scanner; public class Palindrome { static Scanner in=new Scanner(System.in); static char str[

用递归算法判断你是否为回文

…衆ロ難τιáo~ 提交于 2019-11-30 10:05:36
1 package firs; 2 3 import java.util.Scanner; 4 5 public class Digui { 6 private static int a; 7 private static int b=0; 8 public static void ok(String str,int i) 9 { 10 if(i==a/2||i==a/2+1) 11 { 12 System.out.println("yes"); 13 } 14 else 15 { 16 if(str.charAt(i-1)==str.charAt(b)) 17 { 18 i--; 19 b++; 20 ok(str,i); 21 } 22 else 23 { 24 System.out.println("no"); 25 } 26 } 27 } 28 public static void main(String[] args) { 29 Scanner input=new Scanner(System.in); 30 String str; 31 str=input.next(); 32 a=str.length(); 33 ok(str,a); 34 } 35 } 来源: https://www.cnblogs.com/2940500426yingxin/p/11577854

面试问题之数据结构与算法:递归的基本思想

核能气质少年 提交于 2019-11-30 04:33:25
递归是算法设计中的一种基本而重要的算法。递归方法通过函数调用自身将问题转化为本质相同但规模较小的子问题,是分治策略的具体体现。递规的基本思想是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。用递归思想写出的程序往往十分简洁易懂。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进。当边界条件满足时,递归返回。   使用递归要注意以下几点:   (1)递归就是在过程或函数里调用自身   (2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 来源: https://www.cnblogs.com/yichengming/p/11560302.html

线程同步锁、死锁、递归锁、信号量、GIL

筅森魡賤 提交于 2019-11-30 02:19:12
目录 线程同步锁、死锁、递归锁、信号量、GIL 一、同步锁 二、死锁 三、递归锁(Rlock) 四、信号量(Semphare) 五、GIL(全局解释器锁) io密集型 计算密集型 线程同步锁、死锁、递归锁、信号量、GIL 一、同步锁 所有线程同一时间读写同一个数据,有的线程已经对数据进行修改了,造成有的线程拿到的数据时旧的数据,而不是修改后的数据,造成结果不正确,于是引入了同步锁解决问题, 同步锁的原理是同一时间只能有一个线程读写数据。 锁通常被用来实现对共享资源的同步访问。从threading模块导入一个Lock类,为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其他线程已经获得了该锁,则当前线程需等待其被释放),待资源访问完后,再调用release方法释放锁。 下面这个例子就需要用到同步锁: from threading import Thread x = 0 def task(): global x for i in range(20000): x=x+1 # t1 的 x刚拿到0 保存状态 就被切了 # t2 的 x拿到0 进行+1 1 # t1 又获得运行了 x = 0 +1 1 # 思考:一共加了几次1? 加了两次1 真实运算出来的数字本来应该+2 实际只+1 # 这就产生了数据安全问题. if __name__ ==

javascript实现二叉搜索树

≡放荡痞女 提交于 2019-11-30 01:38:36
在使用javascript实现基本的数据结构中,练习了好几周,对基本的数据结构如 栈、队列、链表、集合、哈希表、树、图等内容进行了总结并且写了笔记和代码。 在 github中可以看到 点击查看 ,可以关注一下我哈。 树的基本术语 二叉树节点的存储结构 创建一个二叉搜索树 二叉树的先序、中序、后续遍历算法 二叉树的非递归先序、中序、后续遍历算法 。 文章对树了解的不多的人有点不友好,这里简单介绍(从书上抄下来)那些基本的一点概念吧。 看下面这个示意图 树的基本术语: 结点: A、B、C等都是结点,结点不仅包含数据元素,而且包含指向子树的分支。例如,A结点不仅包含数据元素A、还包含3个指向子树的指针。 结点的度: 结点拥有的子树个数或者分支的个数,例如A结点有3棵子树,所以A结点的度为3. 树的度: 树中各结点度的最大值。如例子中结点度最大为3(A、D结点)。最小为0(F、G、I、J、K、L、M),所以树的度为3。 叶子节点 :又叫做 终端节点, 指度为0的节点,F、G、I、J、K、L、M节点都是叶子节点。 孩子: 结点的子树的根,如A节点的孩子为B、C、D。 双亲: 与孩子的定义对应,如B C D结点的双亲都是A。 兄弟: 同一个双亲的孩子之间互为兄弟。如B、C、D互为兄弟,因为它们都是A节点的孩子。 祖先 :从根到某节点的路径上的所有结点,都是这个节点的祖先。如K的祖先是A B E

n皇后问题 递归和非递归

我是研究僧i 提交于 2019-11-30 00:31:34
问题引入 八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 问题中涉及了回溯算法,它就是一种深度优先搜索算法,每走一步,选择其中的一种可能解,满足就继续走下一步,不满足就回到上一步选择另一种可能的解 下图有助于理解皇后问题的回溯法解决(有其它的解法) 在该问题中了解了回溯算法的流程之后我们需要考虑什么时候回溯,也就是每次放置皇后需要考虑的问题: 放置皇后时是否存在同一行,同一列,互为为对角线位置的皇后存在? 假设该皇后放置在坐标(i,j)的位置,每次检查时检查前i-1行就不会涉及到同一行的情况,同一列问题只需要在放置前n-i行的时候标记皇后所在的列数就能解决,而对角线位置则需要前i-1个皇后的坐标与当前皇后的坐标斜率不为 正负1 在很多情况下八皇后都被推广到n皇后、2n皇后等,并且有一些附加的条件需要考虑,但是归根到底都是对回溯算法的一种考查。 先看看非递归版的 这里我以我洛谷的一道题目来展示N皇后的非递归解法 P1219 八皇后 输入输出样例 输入 6 输出 2 4 6 1 3 5 3 6 2 5 1 4 4 1 5 2 6 3 4 下方是我的题解和注释 #include