递归算法

递归方法的程序设计方法初探

匿名 (未验证) 提交于 2019-12-02 23:36:01
一、题目分析 (一)、赶鸭子问题 1、题目要求 2、具体分析 (二)、角谷定理 1、题目要求 格式如: 输入: 22 输出: 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 STEP=16 2、具体分析 二、算法构造 (一)、赶鸭子问题 1、递归算法 以天数键flag为递归出口判断点,flag也为卖出的天数。 2、非递归算法 通过循环将所卖鸭子数通过天数的变化进行依次迭代。循环变量即为买鸭子的天数,直至循环结束所求问题也结束。 (二)、角谷定理 1、递归算法 将输入的值value设置为递归出口。 2、非递归算法 同“赶鸭子问题”相同,通过循环将只进行依次迭代,直至该值变为1,循环结束。 三、算法实现 (一)、赶鸭子问题 public class GanYaZi { private static int flag = 0 ; public static void main ( String [ ] args ) { System . out . println ( "递归方式求解答案" ) ; System . out . println ( "---------------------------------------------" ) ; gan_dg ( 2 ) ; System . out . println ( "----------

树的子结构――js

匿名 (未验证) 提交于 2019-12-02 23:35:02
树的子结构 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) ˼· 二叉树子结构的意思是包含了一个结点,可以只取左子树或者右子树,或者都不取。例如: 由于A中有一部分子树的结构和B是一样的,因此B是A的子结构。 1.有关二叉树的算法问题,一般都可以通过递归来解决。那么写成一个正确的递归程序,首先一定要分析正确递归结束的条件。 2.如果根节点相同则递归调用isSubtree(),如果根节点不相同,则判断root1的左子树和root2是否相同,再判断右子树和tree2是否相同; 3.注意null的条件,HasSubTree中,如果两棵树都不为空才进行判断,isSubtree中,如果root2为空,则说明第二棵树遍历完了,即匹配成功; 4.root1为空有两种情况:(1)如果root1为空&&root2不为空说明不匹配,(2)如果root1为空,root2为空,说明匹配。 代码 /* function TreeNode(x) { this.val = x; this.left = null; this.right = null; } */ function isSubtree ( root1 , root2 ) { if ( root2 == null ) return true ; if ( root1 == null ) return

递归函数,二分运算

匿名 (未验证) 提交于 2019-12-02 23:34:01
递归函数:在函数中自身调用自己。 def story(): print('ssss') story() #递归调用 story() #调用 常报错recursionerror 这个错误是指超过内存最大深度 最大递归深度默认值是998,这个值是可以修改的 import sys 缺点:递归比较占用内存,所以如果递归次数太多就不适合用该方法来解决了 优点:能使代码变得简单‘’ def age(l): if l == 40: return 40 elif i > 0 and i < 4: return age(l+1) +2 二分查找算法:把数列一分为二通过中间值与要查找的数的比较再进行查找 #二分查找法 -利用递归 l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,88] def find(l,aim,start = 0,end = len(l)): ret = (end - start) // 2 + start if start <= end: if l[ret] < aim: return find(l,aim,start = ret+1,end = end) elif l[ret] > aim: return find(l,aim,start = start,end = ret-1)

递推与递归专题练习

匿名 (未验证) 提交于 2019-12-02 23:05:13
搜索与回溯,指数级算法。 #include<bits/stdc++.h> #define rg register #define il inline #define co const template<class T>il T read(){ rg T data=0,w=1; rg char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') w=-1; ch=getchar(); } while(isdigit(ch)) data=data*10+ch-'0',ch=getchar(); return data*w; } template<class T>il T read(rg T&x){ return x=read<T>(); } typedef long long ll; using namespace std; vector<int>chosen; int n; void dfs(int x){ if(x==n+1){ for(unsigned i=0;i<chosen.size();++i) printf("%d ",chosen[i]); puts(""); return; } dfs(x+1); chosen.push_back(x); dfs(x+1); chosen.pop_back(); } int main(){ /

递归式的三种求解方式

匿名 (未验证) 提交于 2019-12-02 22:56:40
求解递归式对于分冶算法的重要性不言而喻 以下介绍了三种求解递归式的方法 1,代换法: 缺点:代换法主要的缺点在于,对于任何递归式,我们先得去猜其解,对于猜错了同学,如果不幸猜出的结果和正确结果相差太大,虽然可以推导,但是意义不大; 优点:代换法相较于递归树法更为严谨,相较于主定理应用范围更广,主定理只能求解类似于T(n) = aT(n/b)+n/c这种形式的递归式; 下面给出一个递归表达式T(n) = 2T(n/2)+n,求其解; 首先猜一下其解为O(nlgn);那么我们只需要证明T(n)<cnlgn即可 先假设T(n)<cnlgn对于n/2也成立,那么T(n/2)<=c(n/2)lg(n/2)也成立 那么必然的T(n)<=2(c(n/2)(lgn/2))+n-=cnlgn-cnlg2+n<=cnlgn-cn+n 以上表达式,在c>=1时永远成立,得证递归式T(n) = 2T(n/2)+n的解为O(n) 其他递归式的求解方式和上面的大体相似; 2,递归树法 递归树方法利用了将递归式分解为一棵递归树的形式来更加直观的求解递归式; 缺点:递归树方法求解递归式因为丢弃了很多低阶项,所以不够严谨; 优点:递归树方法求解递归式从视觉上更为直观,简单。一般可以先运用递归树求解,然后利用代换法更加严谨得证明用递归树求解的解的数学上的正确性; 下面求T(n) = 2T(n/2)+n的解

Python递归函数的正确理解与使用

匿名 (未验证) 提交于 2019-12-02 22:51:30
先看一个题目: 题面描述 小明很喜欢学数学,并且喜欢做一些奇怪的题,这天他想知道对于给定的 N ,有多少个 M 满足“ M<=N, gcd(N,M)==1, M 是偶数”。请你编写程序帮助小明解决这个问题。 输入数据 输入数据第一行为一个正整数 T ,表示测试数据的组数。 接下来的 T 组测试数据中, 每组测试数据为一行,包含一个整数 N (1≤T≤100, 1≤N≤10000 )。 输出数据 对于每一组输入数据,在单独的一行中输出 ”Case #id: M”, 表示第 id 组数据结果是 M , id 从 1 开始; 样例输入 4 1 2 11 23 样例输出 Case #1: 0 Case #2: 0 Case #3: 5 Case #4: 11 Hint: gcd(a,b)==1 表示 a 与 b 的最大公约数为 1 ,即 a 与 b 互素。 讲讲算法思路 分析输入输出与显示 源代码与递归函数的精华所在 1.两个数互素:最小公约数为1。我们只要把大一点的数%较小的数,上一轮较小的数%这个余数又得到一个余数,每次判断这个余数是0还是1。只要有0出现就不互素。 2.输入用list[]保存。输出的序号可以在循环里面计数。输出赋值:print('Case #%d: %d'%(x,y)) 3. #求法,可能会用到函数,递归函数等 def gcd(x,y):#定义递归函数 if x>=y

课时22:函数:递归是神马

匿名 (未验证) 提交于 2019-12-02 22:11:45
目录:   一、递归是“神马”?   二、写一个求阶乘的函数   三、课时22课后习题及答案 ********************* 一、递归是“神马”? ********************* 递归这个概念,是算法的范畴。那么递归算法在日常编程中有哪些例子呢?             图片一 汉诺塔游戏             图片二 树结构的定义             图片三 谢尔宾斯基三角形             图片四 女神自拍 递归,从原理上来说就是函数调用自身的一个行为。你没听错,在函数内部,你可以调用所有可见的函数,当然包括自己。 举个例子: >>> def recursion(): return recursion() >>> recursion() Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> recursion() File "<pyshell#2>", line 2, in recursion return recursion() File "<pyshell#2>", line 2, in recursion return recursion() File "<pyshell#2>", line 2, in recursion return

算法第三章作业

廉价感情. 提交于 2019-12-02 20:04:56
算法第三章作业 1. 你对动态规划算法的理解(2分) 我觉得动态规划是一种分治法的伪进阶型,它将一个大问题可以分成若干个小问题后,解决子问题,然后将子问题的解插入到一个表中,用一个表来记录所有的已经得到答案的子问题的解,后面就可以发现,无论子问题的解是否被用到,其都在表中,接着求问题便可以节省大量的时间。 2. 分别列出编程题1、2的递归方程(2分) 3-1 m[i] = 1 (n=1) m[i] = max{ m[k}+1 } (1=<k<i) 3-2 m[i] = min{ c[i][j] +m[k],c[i][j] } (i>1) (若i=1,则为0) 3. 说明结对编程情况(1分) 和同学一起进行编程,同时能相互指出错误,并且能够探讨思路,在讨论中还能加深对题目的理解,然后推导出递归方程,接着能够对代码进行分块处理,形成一个个清晰的思路,在写代码的同时还锻炼了我们审计代码的能力。 来源: https://www.cnblogs.com/JeffKing11/p/11761975.html

对前端数据结构与算法的研究----------------引用

隐身守侯 提交于 2019-12-02 18:18:25
1. 递归 递归就是自己调自己,递归在前端里面算是一种比较常用的算法。假设现在有一堆数据要处理,要实现上一次请求完成了,才能去调下一个请求。一个是可以用Promise,就像《前端与SQL》这篇文章里面提到的。但是有时候并不想引入Promise,能简单处理先简单处理。这个时候就可以用递归,如下代码所示: var ids = [34112, 98325, 68125]; ( function sendRequest ( ) { var id = ids . shift ( ) ; if (id ) { $ . ajax ( {url : "/get" , data : {id } } ) . always ( function ( ) { //do sth. console . log ( "finished" ) ; sendRequest ( ) ; } ) ; } else { console . log ( "finished" ) ; } } ) ( ) ; 上面代码定义了一个sendRequest的函数,在请求完成之后再调一下自己。每次调之前先取一个数据,如果数组已经为空,则说明处理完了。这样就用简单的方式实现了串行请求不堵塞的功能。 再来讲另外一个场景:DOM树。 由于DOM是一棵树,而树的定义本身就是用的递归定义,所以用递归的方法处理树,会非常地简单自然

LeetCode解题汇总目录

a 夏天 提交于 2019-12-02 17:37:52
此篇为学习完 《数据结构与算法之美》 后,在 LeetCode 刷题的汇总目录,方便大家查找(Ctrl+F ind ),一起刷题,一起PK交流!Updated on 2019.12.2 刷题可以按照 不同的专题 进行,便于加强某个知识点的理解。 我的 LeetCode 主页 我的 GitHub 主页 已解决 519/1185 - 简单 281 中等 208 困难 30 2019.7.24 - 2019.11.9,108天做了400道题 2019.11.9 - 2019.11.24, AC+100道,4个月共计500道题 参赛记录 LeetCode 2019 力扣杯全国秋季编程大赛 ​ 已解题目,部分太简单的没有列出 LeetCode 1. 两数之和(哈希) LeetCode 2. 两数相加(单链表反转) LeetCode 3. 无重复字符的最长子串(滑动窗口+哈希) LeetCode 4. 寻找两个有序数组的中位数(二分查找,难) LeetCode 7. 整数反转 LeetCode 8. 字符串转换整数 (atoi) LeetCode 9. 回文数 LeetCode 11. 盛最多水的容器(双指针) LeetCode 14. 最长公共前缀 LeetCode 15. 三数之和 LeetCode 16. 最接近的三数之和(固定左端+滑动窗口) LeetCode 17.