递归
Serendipity_筱楠
当你的才华还撑不起你的野心的时,你就应该静下心来学习;当你的能力还驾驭不了你的目标时,就应该沉下心来历练。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
回溯法 —— 判断子集和问题是否存在解
判断子集和问题是否存在解分析思路:采用回溯法针对问题存在解时求出相应的一个或多个解,或者最优解。如果需要判断问题是否存在解(一个或者多个),可以将求解函数改为bool型,当找到任何一个解时返回true,否则返回false,但当问题没有解时需要搜索所有空间。法一代码:#include<stdio.h>#define MAXN 20int n=4,W;int w[]={0,11,13,24,7}; //存放所有整数解,不用下标为0的元素bool dfs(int tw,int rw原创 2020-09-25 20:26:25 · 1207 阅读 · 0 评论 -
回溯法 —— 求解子集和问题
求解子集和问题的解题目描述:给定有n个不同正整数的集合w=(w1,w2,… ,wn)和一个正数W,要求找出w的子集s,式该子集中所有元素的和为W。例如,当n=4时,w=(11,13,24,7),W=31,则满足要求的子集为(11,13,7)和(24,7)分析思路:n=4时,解空间树如图(结点中的数字是结点的编号,例如结点18对应解向量为(1,1,0,1),选择的整数和=11+13+7=31),从i层到i+1层(1<=i<=n)的每一条边标有xi的值,xi或者为1或者为0,xi为1时表示取原创 2020-09-25 19:54:16 · 24301 阅读 · 3 评论 -
回溯法 —— 求解0/1背包问题(剪枝)
0/1背包问题题目描述:有n个重量分别为w1,w2,…,wn的物品(物品编号为1~n),它们的价值分别为v1,v2,…,vn,给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么选不中,要求选中的物品不仅能够放到背包中,而且具有最大价值,并对下表所示4个物品求出W=6时的所有解和最佳解。分析思路:回溯法设n件物品重量分别为w1,w2,…,wn的物品,用数组w[1 … n]存放,物品的价值分别为v1,v2,…,vn,用数组v[n]存放;限制重量用W表示。用x[原创 2020-09-25 09:45:32 · 18163 阅读 · 8 评论 -
分治法 —— 折半查找(递归与非递归)
折半查找(二分查找)假设为递增有序基本思路时间复杂度:O(log2 n)设a[low…high]是当前查找区间,首先确定该区间的中点位置mid=L(low+high)/2I,然后将待查的k值与a[mid].key比较(1)若k==a[mid].key,则查找成功并返回该元素的物理下标(2)若k<a[mid],则由表的有序性可知a[mid…high]均大于k,因此若表中存在关键字等于k的元素。则该元素必位于左子表a[low…mid]中,新的查找区间是左子表a[low…mid-1](3)原创 2020-08-24 21:59:48 · 4576 阅读 · 0 评论 -
递归算法设计 —— 选择排序和冒泡排序
问题:对于给定的含有n个元素的数组a,分别采用选择排序和冒泡排序方法:将a[0…n-1]分为有序区a[0…n-1]和无序区两个部分,有序区中的所有元素都不大于无序区中的元素,初始时有序区为空,即i=0,经过n-1趟排序(i=1~n-2),每趟排序采取不同方式将无序区中的最小元素移动到无序区的开头,即a[i]处。选择排序采用比较方式在无序区中选择最小元素并放到开头设f(a,n,i)用于在无序区a[i…n-1] (共n-i个元素)中选择最小元素并放在a[i]处,是“大问题“则f(a,n,i原创 2020-08-24 12:11:24 · 2064 阅读 · 0 评论 -
栈和递归---手动实现一个栈和蒜头君吃桃
栈push——压入pop——弹出特点:先进后出一、手动实现一个栈封装数据结构——栈写成class或struct,将当前栈的数据和对当前栈的操作都放在里面定义一个结构体Stack,规定最大存储元素个数10000,然后用来定义存储数据的数组int data[10000],top指示现在栈顶的下标,栈底没有元素,默认下标为0,初始化时,栈中没有元素,top的值为-1.代码:#include<iostream>using namespace std;struct Stack{ in原创 2020-07-06 17:10:37 · 209 阅读 · 0 评论 -
递归法:从n个小球中取m个小球(不放回),共有多少种取法?
从n个小球中取m个小球(不放回),共有多少种取法?利用假设法设3个球A,B,C,任意取出2个,可分为取出的球中含A的部分和不含A的部分。即AB,AC为一组,BC为一组。4个A,B,C,D里面取3个,结果为:ABC,ABD,ACD,BCD,一共4种取法设函数F(n,m)return F(n-1,m-1)+F(n-1,m) 假设一个特殊的球A,把整个取法分为含A的部分和不含A的部分,进行...原创 2020-02-11 15:44:31 · 3224 阅读 · 0 评论 -
递归法:实现指数型枚举(二叉树递归)
问题:从1-n这n个整数中随机选取任意多个,输出所有可能选举方案输入格式:输入一个整数n输出方案:每行输出一种方案同一行中的数必须升序排列,相邻两个数之间用空格隔开对于没有任何数的方案,输出空行数据范围:1<=n<=15输入样例:3输出样例:322 311 21 31 2 3...原创 2020-02-15 16:30:02 · 307 阅读 · 0 评论 -
递归法:递归实现排列型
把1-n这n个数排成一行后随机打乱顺序,输出所有可能的次序输入格式:一个整数n输出格式:按照从小到大(顺序输出所有方案,每行1个)同一行相邻两个数用空格隔开对于两个不同的行,对应下标数一一比较,字典序娇小的排在前面数据范围:1<<n<<9...原创 2020-02-15 17:44:07 · 324 阅读 · 0 评论 -
2018年c++B:换零钞;激光样式(递归法和暴力破解)
填空题1.题目:x星球的钞票面额只有100元,5元,2元,1元,共4种。小明去x星旅游,他手中只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱。小明有点强迫症,他坚持要求200元换出的零钞中2元的张数刚好是1元的张数的10倍,剩下的当然都是5元面额的。银行的工作人员有点为难,你能帮助算出:在满足小明要求的前提下,最少要换给他多少张钞票吗(5元,2元,1元面额的必须都有,不能...原创 2020-02-17 12:45:58 · 309 阅读 · 0 评论 -
递归法:快速掌握递归核心方法
递归我的理解就是方法或函数调用自己就称为递归1.分解为:直接量+小规模问题2.分级为:小规模问题要想计算f(10),就需要知道f(9),算f(9)需要计算f(8)特点:1.自身调用自身2.避免死循环方法:1.找重复(找更小规模的子问题(和原问题具有相同的形式);求n的阶乘,先求n-1的阶乘。。。。)2.找变化(哪些东西在变化,求n的阶乘,先求n-1的阶乘,。。。。将变化的量作...原创 2020-02-18 19:56:12 · 1997 阅读 · 0 评论 -
递归法 最大公倍数 斐波那契数列 数组插入排序改递归
辗转相除法:例如:m%n=0;能够整除则n为最大公倍数若m%n=k,不能够整除的话,继续辗转相除变为n%k若n%k=c,不能整除的话继续这样…核心代码static int gcd(int m,int n){ if(n==0) return m; return gcd(n,m%n);} 斐波那契数列转化为二叉树:...原创 2020-02-18 21:46:24 · 216 阅读 · 0 评论 -
递归法:汉诺塔(快速掌握)
汉诺塔分析:转换柱子的角色,和辅助柱子发现从递归角度:将1-N与2-N移动到B之后,在C不动的情况下,并不是同一个等价形式;经过转化之后:以下形式与原来的1-N等价把1-N-1移动到C,N移动到B,当N移动到B柱子之后,不会再移动,这时可以将B看为空柱子1-N-2移动到A,N-1移动到B上图中将A柱子作为辅助//N:初始的N个从小到大的盘子,N为最大的编号//from:原始的柱子 ...原创 2020-02-19 13:30:26 · 495 阅读 · 0 评论 -
递归法:走楼梯; 旋转数组的最小数字(递归法和改进二分法)
题目:走楼梯小明在走楼梯,楼梯有n阶台阶,一次可以上1阶,2阶或者3阶,实现一个方法,计算小明有多少种走楼梯的方式package louti;import java.util.Scanner;public class Floor { public static void main(String[] args) { Scanner sc=new Scanner(System.in)...原创 2020-02-19 20:48:55 · 270 阅读 · 0 评论 -
2013蓝桥杯C++B:第39阶台阶(递归法);前缀判断
三、题目:第39阶台阶小明刚刚看完电影《第39级台阶》。离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!站在台阶前,他突然又想着一个问题:如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?请你利用计算机的优势,帮助小明寻找答案。分析:可以使用模式匹配法:递归法f(n)=f(n-1)...原创 2020-03-07 21:28:58 · 525 阅读 · 0 评论 -
2013蓝桥杯C++A:排它平方数(递归,枚举,暴力解法)
二、题目: 排它平方数小明正看着 203879 这个数字发呆。原来,203879 * 203879 = 41566646641这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。具有这样特点的6位数还有一个,请你找出它!再归纳一下筛选要求:6位正整数每个数位上的数字不同其平方数的每个数位不含原数...原创 2020-03-14 21:42:18 · 307 阅读 · 1 评论 -
2013蓝桥杯C++A:振兴中华(递归法)
三、题目:振兴中华小明参加了学校的趣味运动会,其中的一个项目是:跳格子。地上画着一些格子,每个格子里写一个字,如下所示:比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。要求跳过的路线刚好构成“从我做起振兴中华”这句话。请你帮助小明算一算他一共有多少种可能的跳跃路线呢?虽然说这到题都可以口算出来,但是它还是...原创 2020-03-15 20:21:43 · 591 阅读 · 2 评论 -
2017蓝桥杯B组:取数位(递归,求余和除法)
五、题目:取数位求1个整数的第k位数字有很多种方法。以下的方法就是一种。题目所给代码如下:// 求x用10进制表示时的数位长度int len(int x){if(x<10) return 1;return len(x/10)+1;}// 取x的第k位数字int f(int x, int k){if(len(x)-k==0) return x%10;return ___...原创 2020-04-07 21:16:55 · 548 阅读 · 0 评论 -
试题1 入门训练 Fibonacci数列
问题描述Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。输入格式输入包含一个整数n。输出格式输出一行,包含一个整数,表示Fn除以10007的余数。样例输入10样例输出55样例输入22样例输出7704代码:#include<iostream>using namespace std;const int N=1000010;int f(int n){原创 2020-05-09 21:28:17 · 1270 阅读 · 0 评论
分享