递归算法

C++递归函数

巧了我就是萌 提交于 2019-12-08 09:26:06
C++递归函数 【递归,就是在运行的过程中调用自己】 比如:(点击了下面的递归,搜索结果还是递归) A.构成递归需具备的条件: 1.子问题须与原始问题为同样的事,且更为简单。 2.不能无限制的调用本身,必须有个出口,化简为非递归状况处理。 B.递归可以解决的问题: 阶乘、斐波那契数列、汉诺塔、杨辉三角的存取、字符串回文判断、字符串全排列、二分查找、树的深度求解 C.递归的过程(图片来源见水印,侵删) 【递归的过程可以理解为,把一个复杂的问题转化为一个个的小问题,而小问题能转化为更简单的问题,直到达到递归的“终点”——递归边界。递归边界是递归问题的特殊案例或者简单的情况,通过递归边界向上一层一层的返回数据,结束递归】 D.递归实例 Example ①://阶乘 #include <iostream> using namespace std; int Leo(int n) { int sum = 1; if(1 == n)//递归终止条件 { return 1; } sum =n * Leo(n - 1); return sum;//返回阶乘的总和 } int main() { int num; cin >> num;//输入一个数 cout << Leo(num) << endl; //输出该数的阶乘 return 0; } /* *在求X的阶乘和时 *可以利用递归的思想

PHP用递归返回无限级分类回字符串或数组实例

夙愿已清 提交于 2019-12-08 09:24:59
在栏目比较多的网站中,经常会用到无限分类,本文我们来分享一个用php递归实现的无限分类实例,实例的返回值可以选择是字符串还是数组,很实用。 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性。那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类。 递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义函数中,将参数等变量保存,函数中重复调用函数,直到达到某个条件才跳出,返回相应的数据。 Mysql 首先我们准备一张数据表class,记录商品分类信息。表中有三个字段,id:分类编号,主键自增长;title:分类名称;pid:所属上级分类id。 class表结构: CREATE TABLE IF NOT EXISTS `class` ( `id` mediumint(6) NOT NULL AUTO_INCREMENT, `title` varchar(30) NOT NULL, `pid` mediumint(6) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 插入数据后,如图: PHP 根据不同的需求,我们提供两种不同格式的自定义函数,一种是返回字符串,一种是返回数组,两种函数都使用了递归方法

C++中的递归

谁说我不能喝 提交于 2019-12-08 09:24:47
1.概念 递归函数即自调用函数,在函数内部直接的或者间接地调用自己。在求解某些具有随意性的复杂问题时经常使用递归,如要求编写一个函数,将输入的任意长度的字符串反向输出。普通做法是将字符串放入数组中然后将数组元素反向输出即可,然而这里的要求是输入是任意长度的,总不能开辟一个很大的空间保存字符串吧?这时候递归就起作用了。递归采用了分治的思想,将整体分割成部分,从最小的基本部分入手,逐一解决,其中部分通常和整体具有相同的结构,这样部分可以继续分割,直到最后分割成基本部分。 递归函数必须定义一个终止条件,即什么情况下终止递归,终止继续调用自己,如果没有终止条件,那么函数将一直调用自己,知道程序栈耗尽,这时候等于是写了一个Bug! 总结递归的特点: (1) 使用递归时,一定要有明确的终止条件! (2) 递归算法解题通常代码比较简洁,但不是很容易读懂。 (3) 递归的调用需要建立大量的函数的副本,尤其是函数的参数,每一层递归调用时参数都是单独的占据内存空间,他们的地址是不同的,因此递归会消耗大量的时间和内存。而非递归函数虽然效率高,但相对比较难编程。 (4) 递归函数分为调用和回退阶段,递归的回退顺序是它调用顺序的逆序。 2.实践 斐波那契数列当n>3时,第n个元素的值等于第n-1个元素和n-2个元素的和,当n不确定具体数值时,可以通过递归的方式实现 int Fib(int n) { if

[算法]无限递归字符串查询(python实现)

天大地大妈咪最大 提交于 2019-12-08 09:17:01
无限递归字符串查询 题目地址:the-infinite-string 题目描述 Description Consider a string A = “12345”. An infinite string s is built by performing infinite steps on A recursively. In i-th step, A is concatenated with ‘$’ i times followed by reverse of A. A=A|$…$|reverse(A), where | denotes concatenation. Constraints:1<=Q<=10^5, 1<=POS<=10^12 Input 输入第一行为查询次数,后面为每次查询的具体字符位置。 Output 输出每一次查询位置上的字符。 Sample Input 1 2 3 10 Sample Output 1 3 2 题目解析: 题目中的A=A|$...$|reverse(A)是什么意思呢,如下所示 A1 = 12345 A2 = 12345$54321 = A1|$*1|reverse(A1) A3 = 12345$54321$$12345$54321 = A2|$*2|reverse(A2) = A2|$*2|A2 ... An = An-1|$*n-1

《大话数据结构》常见排序算法总结(一)

北城余情 提交于 2019-12-07 22:01:53
文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.04.06 lutianfei none V1.1 2016.07.19 lutianfei 增加了快速排序算法 排序 外排序:需要在内外存之间多次交换数据才能进行 内排序: 插入类排序 直接插入排序 希尔排序 选择类排序 简单选择排序 堆排序 交换类排序 冒泡排序 快速排序 归并类排序 归并排序 排序方法 平均情况 最好情况 最坏情况 辅助空间 稳定性 冒泡排序 O(n^2) O(n) O(n^2) O(1) 稳定 简单选择排序 O(n^2) O(n^2) O(n^2) O(1) 稳定 直接插入排序 O(n^2) O(n) O(n^2) O(1) 稳定 希尔排序 O(nlogn)~O(n^2) O(n^1.3) O(n^2) O(1) 不稳定 堆排序 O(nlogn) O(nlogn) O(nlogn) O(1) 不稳定 归并排序 O(nlogn) O(nlogn) O(nlogn) O(n) 稳定 快速排序 O(nlogn) O(nlogn) O(n^2) O(logn)~O(n) 不稳定 测试工程说明 下文都是用以下测试用例进行测试 public static void main (String[] args) { int [] A = new int [] { 11 , 2 , 3 , 22 ,

开发中常见的算法汇总一览

心已入冬 提交于 2019-12-07 22:00:39
我们知道计算机中各类应用程序随处可见的,而支撑这些应用程序运行的就是各类数据结构以及各类算法,这就是经典等式 程序=数据结构+算法 ,上一篇幅中我们列举了一些常用的数据结构,那么今天我们来捋一捋日常开发中常见的一些算法思想以及具体算法各自的特性及相关指标 文章目录 常见算法思想 穷举法(Brute Force) 核心思想 特性 适用问题或算法 分治法(Divide and Conquer) 核心思想 特性 适用问题或算法 贪心算法(Greedy) 核心思想 特性 适用问题或算法 动态规划法(Dynamic Programming) 核心思想 特性 适用问题或算法 回溯法(Backtracking) 核心思想 特性 适用问题或算法 分枝界限法(Branch and Bound) 关于递归(画外音) 贪心和动态规划(画外音) 常见的算法分类 排序算法 冒泡排序 插入排序 希尔排序 选择排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 排序算法总结 查找算法 顺序查找 二分查找 散列查找 二叉树查找 搜索算法 树的层次遍历 树的(前/中/后)序遍历 常见算法思想 我们首先介绍下几种常见的算法思想,日常中一些具体的解题算法的思想都依赖于它们,文中列举一些具体算法问题可以自行通过搜索引擎了解 穷举法(Brute Force) 核心思想 顾名思义就是列举出所有可能出现的情况

PrefixSpan算法原理总结

一曲冷凌霜 提交于 2019-12-07 19:43:40
转自 http://www.cnblogs.com/pinard/p/6323182.html   前面我们讲到频繁项集挖掘的关联算法Apriori和FP Tree。这两个算法都是挖掘频繁项集的。而今天我们要介绍的PrefixSpan算法也是关联算法,但是它是挖掘频繁序列模式的,因此要解决的问题目标稍有不同。 1. 项集数据和序列数据     首先我们看看项集数据和序列数据有什么不同,如下图所示。     左边的数据集就是项集数据,在Apriori和FP Tree算法中我们也已经看到过了,每个项集数据由若干项组成,这些项没有时间上的先后关系。而右边的序列数据则不一样,它是由若干数据项集组成的序列。比如第一个序列<a(abc)(ac)d(cf)>,它由a,abc,ac,d,cf共5个项集数据组成,并且这些项有时间上的先后关系。对于多于一个项的项集我们要加上括号,以便和其他的项集分开。同时由于项集内部是不区分先后顺序的,为了方便数据处理,我们一般将序列数据内所有的项集内部按字母顺序排序。 2. 子序列与频繁序列     了解了序列数据的概念,我们再来看看上面是子序列。子序列和我们数学上的子集的概念很类似,也就是说,如果某个序列A所有的项集在序列B中的项集都可以找到,则A就是B的子序列。当然,如果用严格的数学描述,子序列是这样的:     对于序列A={a1,a2,...ana1,a2,

递归算法

好久不见. 提交于 2019-12-07 13:04:41
递归 (一)简单的斐波那契数列 以下数列0 1 1 2 3 5 8 13 21 …被称为斐波纳契数列。 这个数列从第3项开始,每一项都等于前两项之和。 输入一个整数N,请你输出这个序列的前N项。 输入格式 一个整数N。 输出格式 在一行中输出斐波那契数列的前N项,数字之间用空格隔开。 数据范围 0 < N < 46 0<N<46 输入样例: 5 输出样例: 0 1 1 2 3思路:采用递归的思路+记忆化数组的方式 #include<iostream> using namespace std; int f[50]; int dfs(int x) { if(f[x]!=0) return f[x]; if(x==1) return 0; else if(x==2||x==3) return 1; else return f[x]=dfs(x-1)+dfs(x-2); } int main() { int i,j,n; cin>>n; for(i=1;i<=n;i++) cout<<dfs(i)<<" "; return 0; } (二) 递归实现指数型枚举 从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。 输入格式 输入一个整数n。 输出格式 每行输出一种方案。 同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。 对于没有选任何数的方案,输出空行。

递归的应用之乘方

 ̄綄美尐妖づ 提交于 2019-12-07 09:01:54
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 乘方问题 对于给定的整数x和y,用递归求出x的y次方的值。其核心思想是:x^y=(x^2)^(y/2)。 下面给出java中的实现代码: public static long power(long x,long y){ if(y==1){ return x; } if(y%2==1){ return x*power(x*x,y/2); } return power(x*x,y/2); } 来源: CSDN 作者: iLemon 链接: https://blog.csdn.net/yanan_seachange/article/details/39521005

全排列与next_permutation

梦想与她 提交于 2019-12-07 04:47:37
全排列是面试笔试过程中经常遇到的一个问题。对于练习过的同学来说,这个问题其实 不算一个难题,但是对于没有练习过的同学,或者说只是知道大致思路的同学来说, 要在短时间内写出正确的全排列代码还是有点难度的。 本文是作者在学习全排列时的一个总结笔记,主要包括: [1]. 全排列的递归实现 [2]. 全排列的非递归实现 [3]. STL中的next_permutation 全排列的递归实现 递归方法的全排列思想挺简单的,就是从第一个数字起,将它与其后面的每个数字 进行交换。 这是大部分教程或博客告诉我们的。我在读完这句话后也觉得挺简单的,就是一个 不断交换的过程嘛,例如“123”的全排列就是将1与后面的每个数字交换得到“213”, “321”,再将第二个数字与之后的每个数字交换得到“132”,“231”,“312”,这样就 得到了“123”的全排列:123,213,321,132,231,312. 然而,当让我在纸上把代码写出来时,就懵了,不知道要从何入手了。 我对递归的理解也不是很透彻,相信看到这篇文章的你也不会很透彻, (透彻的话谁还来搜“全排列的递归实现”啊)。 所以,接下来,我们不能用人的思路来考虑问题了,要从计算机的角度出发,从 递归的角度出发来看问题。 那么,问题转化为:输入数据是“123”,期望得到的结果是顺序输出“123”,“132”, “213”,“231”,“312”,