递归

采用递归生成排列

蓝咒 提交于 2020-03-01 19:29:35
话不多说,代码如下: # include <iostream> using namespace std ; inline void Swap ( int & a , int & b ) { int temp = a ; a = b ; ; b = temp ; } void Perm ( int list [ ] , int begin , int end ) { if ( begin == end ) { for ( int i = 0 ; i <= end ; i ++ ) { cout << list [ i ] ; } cout << endl ; } else { for ( int i = begin ; i <= end ; i ++ ) { Swap ( list [ begin ] , list [ i ] ) ; Perm ( list , begin + 1 , end ) ; Swap ( list [ begin ] , list [ i ] ) ; } } } int main ( ) { int arr [ 3 ] = { 1 , 2 , 3 } ; Perm ( arr , 0 , 2 ) ; return 0 ; } 来源: CSDN 作者: CJ--F 链接: https://blog.csdn.net/qq_45585519/article

递归总结。

喜夏-厌秋 提交于 2020-03-01 16:05:11
递归的话就是在函数内部调用函数,这类题都是有一定的关联关系的。 递归的关键在于找出 递归定义 和 递归终止条件。 例题一: 集合的全排列问题 例如输入 123 样例输出: 123 132 213 231 321 312 # include <iostream> # include <cstring> using namespace std ; void f ( char a [ ] , int k , int m ) 数组,排列的起始下标,最后的的元素下标。 { if ( k == m ) 如果排到最后了,就输出结果 { for ( int i = 0 ; i <= m ; i ++ ) cout << a [ i ] ; cout << endl ; } else for ( int i = k ; i <= m ; i ++ ) { swap ( a [ i ] , a [ k ] ) ; f ( a , k + 1 , m ) ; swap ( a [ i ] , a [ k ] ) ; 就是回溯。 } } int main ( ) { char b [ 28 ] ; cin >> b ; char a [ 27 ] ; int m = strlen ( b ) - 1 ; for ( int i = 0 ; i <= m ; i ++ ) a [ i ] = b [ i ]

题目:求1+2+3+4+.....+n的和

懵懂的女人 提交于 2020-03-01 15:06:49
要求: 不能使用乘除法 不能使用if、while、switch等语句 解题思路分析: for循环可以用递归来代替 不能用if判断语句可以用逻辑运算符来代替 题解: var sumNums = function(n) { //逻辑与&&运算符的短路特性 //n为false则不会执行后续代码 //n为true则返回的是&&后边的代码 //即: // 如果n大于0则返回n+sunNums(--n) // 如果n等于0了则执行停止了 return n && n+sumNums(--n); }; 来源: oschina 链接: https://my.oschina.net/u/4207725/blog/3182814

树—最“有套路”的数据结构

ぃ、小莉子 提交于 2020-03-01 09:41:13
前言 标题用“有套路”来形容一种数据结构,似乎有点不尊重的意思。不过,我倒是觉得,一种实用的学科,就是应该产生一点套路,这才能发挥体系化研究的优势,套路就是一种保证: 在不投入更多创造性与努力的情况下,依旧能获得比起随意进行相关操作更好的结果 。一门成熟的学科都应如是,如果研究许久,在学科所研究的许多问题的实践上还不如一些“天赋”“灵感”,那就不得不说这门学科的“伪科学”或者“水分”还是蛮大的了。 言归正传,这篇文章将会是一系列寻找算法与数据结构的文章的开篇,树由于其特性,是递归、分治等等重要算法思想的典型载体,同时套路性较强又具有一定规律和难度,上手后,也可以获得总结其他算法“套路”的必要经验。作为一个训练的开头,还是很合适了。 树的定义与理解 先简要谈谈树的抽象定义:树本质上是一种无向图( 图:由顶点与路径构成的数据结构 ),其中,任意两个顶点之间 有且只有一条 路径。简而言之,树是一种具有特殊性质的图。 树的结构非常直观,而且树的大多数结构具有一个重要性质: 递归 。主要来说,就是树具有某一性质时,往往其子树也具有同样的性质。比如说,一个树如果是二叉搜索树,其子树也必须是二叉搜索树。 根据这样的性质,遇到树的问题,很自然会考虑如何合理使用递归算法,其实质就是:分解为子问题,最后解决基本情况,把复杂的递归过程交给计算机来处理。所以,树类型代码的特点就是简洁(不过换句话说

php数组排序(递归实现)

Deadly 提交于 2020-03-01 08:53:20
<?php $arr = ['7','2','6','9','5','3','8','1','4']; function _sort( $Arr, &$newArr = array() ){ if ( count($Arr) ) { $lenNum = count($newArr); if ( $lenNum ){ #Arr[0] 当前值 比数组的第一位还小 if ( $newArr[0] > $Arr[0] ){ array_splice($newArr,0,0,$Arr[0]); #Arr[0] 当前值 比数组的最后一位还大 }else if ( $newArr[ $lenNum-1 ] < $Arr[0] ){ array_splice($newArr,$lenNum,0,$Arr[0]); #介于两者之间 }else{ foreach ($newArr as $k => $v) { if ( ($v < $Arr[0]) && ($newArr[$k+1] > $Arr[0]) ){ array_splice($newArr,$k+1,0,$Arr[0]); break; } } } }else{ array_push($newArr, $Arr[0]); } array_shift($Arr); return _sort($Arr,$newArr); }else{

pta题解

≡放荡痞女 提交于 2020-03-01 07:04:11
pta题解 习题2.6 递归求简单交错幂级数的部分和 (15分) 做递归题,我们首先肯定要先考虑它的边界,什么时候停下来,就是当n=1或者n=0的时候就返回x,然后做这种题就慢慢推,比如把n等于2带进去推,就能得到递归式 double fn ( double x , int n ) { if ( n <= 1 ) return x ; else return x - x * fn ( x , n - 1 ) ; } 习题3.3 线性表元素的区间删除 (20分) 遍历,用rear来标记,如果满足条件的,就存放到rear的位置上,然后rear++,就相当于之间覆盖上去,不去做删除操作,就之间覆盖,这样方便很多 List Delete ( List L , ElementType minD , ElementType maxD ) { Position rear = 0 , i ; int cut = 0 ; for ( i = 0 ; i <= L -> Last ; i ++ ) { if ( L -> Data [ i ] <= minD || L -> Data [ i ] >= maxD ) { L -> Data [ rear ] = L -> Data [ i ] ; rear ++ ; cut ++ ; } } L -> Last = cut - 1 ; return L

C Primer Plus 第9章 函数 9.3 递归

情到浓时终转凉″ 提交于 2020-03-01 06:13:05
9.3.1 递归的使用 为了具体说明,请看下面的例子。程序清单9.6中函数main()调用了函数up_and_down()。 我们把这次调用称为“第一级递归”。然后up_and_down()调用其本身,这次调用叫做“第二级递归”。 第2级递归调用第3级递归,依此类推。为了深入其中看看究竟发生了什么, 程序不仅显示出了变量n的值,还显出出了存储n的内存的地址&n(本章稍后部分将更全面的讨论&运算符。 printf()函数使用%p说明符来指示地址 )。 程序清单9.6 recur.c程序 /*recur.c --递归举例*/ #include <stdio.h> void up_and_down(int); int main(void) { up_and_down(1); return 0; } void up_and_down (int n) { printf("Level %d : n location %p\n",n,&n); /*1*/ if(n<4) up_and_down(n+1); printf("Level %d : n location %p\n",n,&n); /*2*/ } 我们来分析程序中递归的具体工作过程。首先main()使用参数1调用了函数up_and_down()。于是up_and_down()中形式参量n的值为1,故打印语句#1输出了Leve 1。 然后

SQL Server 2008中的CTE递归查询

隐身守侯 提交于 2020-03-01 03:40:09
今天基本搞清楚SQL Server中递归查询的实现方式,So,先记录下来。不过呢,个人觉得SQL Server的递归查询相对于Oracle中的递归查询更加难以理解 。 从SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,这对查询树形或层次结构的数据很有用。CTE即公用表表达式,虽然不恰当,但你可以将它看做成一个临时命名的结果集合。 我们先建立一个示例表,名称为MENU,表示菜单的层次结构: CREATE TABLE MENU ( name nvarchar(50) NOT NULL PRIMARY KEY, senior nvarchar(50) NULL ); INSERT INTO MENU values ('文件',NULL), ('新建','文件'), ('项目','新建'), ('使用当前连接查询','新建'); 表示的菜单层次如下: 文件 新建 项目 使用当前连接查询 OK,先看CTE的语法: WITH CTE名称(字段列表) AS ( 查询语句 ) 例如: WITH lmenu(name,senior) as ( SELECT name,senior from menu ) 我们定义了一个名称为lmenu的CTE,这样我们后续即可直接使用lmenu来查询,如: SELECT * FROM lmenu

汉诺塔的递归实现

梦想与她 提交于 2020-03-01 03:30:16
求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求。 输入格式: 输入为一个正整数N,即起始柱上的盘数。 输出格式: 每个操作(移动)占一行,按柱1 -> 柱2的格式输出。 输入样例: 3 输出样例: a -> c a -> b c -> b a -> c b -> a b -> c a -> c #include<cstdio> #include<cstdlib> #include<cstring> void ta(int n,char A,char B,char C); int main() { int n; scanf("%d",&n); ta(n,'a','b','c'); return 0; } void ta(int n,char A,char B,char C) { if(n==1) printf("%c -> %c\n",A,C); else { ta(n-1,A,C,B); printf("%c -> %c\n",A,C); ta(n-1,B,A,C); } } 你说递归不香吗?何必为难自己。 来源: CSDN 作者: qq_34928355 链接: https://blog.csdn.net/qq_34928355/article/details

二叉树递归和非递归遍历

☆樱花仙子☆ 提交于 2020-03-01 03:27:46
二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就 是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历 中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 1.递归实现 void preOrder1(BinTree * root) // 递归前序遍历 { if (root != NULL) { cout << root -> data << " " ; preOrder1(root -> lchild); preOrder1(root -> rchild); } } 2.非递归实现 根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下: 对于任一结点P: 1)访问结点P,并将结点P入栈; 2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1