递归

数据结构与算法学习笔记九 --- 快速排序算法

梦想与她 提交于 2020-02-28 18:51:27
快速排序算法(Quick Sort) 快速排序算法是一种递归排序算法; 其 原理 是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 简单点理解就是:以序列中的任意一个元素为基准(一般以第一个元素),通过逐个比较后,找到这个基准元素的合适位置(即在基准元素的左边元素都比它小,右边都比它大),这时在将序列分成左右两个部分,在继续上述的操作,直到不能再分为止(只有一个元素),此时排序也就完成。 快速排序过程图 快速排序算法的python实现 快速排序算法的代码实现最主要的是找到基准元素的位置,然后分成两部分,再用递归的方法,重复实现一样的操作。 代码如下: def quick_sort ( alist , first , last ) : """快速排序""" # 参数first,last:指定序列排序的位置起始和终止下标 # 只有当first小于last时才退出排序,此时元素只有一个。 if first >= last : return alist else : mid_value = alist [ first ] low = first high = last while low < high : # high 左移 while

js实现树级递归,通过js生成tree树形菜单(递归算法)

妖精的绣舞 提交于 2020-02-28 16:09:51
需求:首先这是一个数据集—js的类型,我们需要把生成一个tree形式的对象 : var data = [ { id: 1, name: "办公管理", pid: 0 }, { id: 2, name: "请假申请", pid: 1 }, { id: 3, name: "出差申请", pid: 1 }, { id: 4, name: "请假记录", pid: 2 }, { id: 5, name: "系统设置", pid: 0 }, { id: 6, name: "权限管理", pid: 5 }, { id: 7, name: "用户角色", pid: 6 }, { id: 8, name: "菜单设置", pid: 6 }, ]; id,与pid之间的对应关系,当pid不存在,或pid:0的时候,这一项,应该为树的顶端,那么我们需要去重新建一次索引,怎么建呢,,,以原数据集的id的值,重新生成一个数据如下: var data = [ {id: 1, name: "办公管理", pid: 0 , children:[ { id: 2, name: "请假申请", pid: 1, hildren:[ { id: 4, name: "请假记录", pid: 2 }, ], }, { id: 3, name: "出差申请", pid: 1}, ] }, {id: 5, name:

(算法笔记)排列组合---递归实现

一笑奈何 提交于 2020-02-28 14:20:39
package CollectionDemo; //Java实现排列组合--递归 //参考:https://blog.csdn.net/chunrudikai/article/details/60958993?utm_source=app import java.util.ArrayList; import java.util.List; public class PailiexuheDemo { static ArrayList<String> arrayList1=new ArrayList<>(); public static void main(String[] args) { String[] color = {"红", "蓝", "黑"}; String[] size = {"S", "M", "L"}; String[] other = {"a", "b"}; List<String[]> list = new ArrayList<String[]>(); list.add(color); list.add(size); list.add(other); sorting(list, color, ""); for(String str:arrayList1){ System.out.println(str); } } public static void

Python学习_第二模块_三元运算&函数

余生颓废 提交于 2020-02-28 12:32:11
三元运算 a = 2 b = 5 val = a if a < b else b print(val) #2 # 如果 a 小于 b val 就等于a 反之等于b 函数 例1 定义一个函数 def sayhi(): print('hhhhh') print(sayhi) # 函数的内存地址 sayhi() #调用函数 #结果 #<function sayhi at 0x0000000002592488> #hhhhh 函数传参 # 2 函数传参 def calc(x,y): res = x**y return res   #返回函数的执行结果 c = calc(2,2) print(c) # 4 函数参数说明 """ 函数参数: 形参变量 只有在被调用时才分配内存单元,在调用结束时,即释放所分配的内存单元,因此形参只在函数内部有效。 函数调用结束返回主调用函数后则不能再使用该形参变量 实参 可以是常量 变量 表达式 函数等,无论实参是何种类型的量,在进行函数调用时,它们必须有确定的值, 以便把这些值传送给形参。 因此应预先用赋值 输入等办法使参数获得确定值 """ 形参与实参 例子说明 # 形参 与实参的说明 def calc(x,y): # x, y 是形参 res = x**y return res c = calc(2,4) # 2, 4 是实参 print(c) #16

斐波那契额数列的递归和非递归方法,纯C语言

為{幸葍}努か 提交于 2020-02-28 12:19:54
# include <stdio.h> # include <stdlib.h> int feibo ( int n ) ; //非递归 int feiboDigui ( int n ) ; //递归 int main ( ) { int n ; while ( scanf ( "%d" , & n ) != EOF ) { printf ( "%d\n" , feiboDigui ( n ) ) ; //目前是递归方法,非递归换一下就ok } return 0 ; } int feibo ( int n ) { //非递归 int sum1 = 1 , sum2 = 1 , sum , i ; if ( n == 1 ) { return 1 ; } if ( n == 2 ) { return 1 ; } for ( i = 3 ; i <= n ; i ++ ) { sum = sum1 + sum2 ; sum1 = sum2 ; sum2 = sum ; } return sum ; } int feiboDigui ( int n ) { if ( n == 1 || n == 2 ) { //递归函数出口 return 1 ; } else { return ( feiboDigui ( n - 2 ) + feiboDigui ( n - 1 ) ) ; } }

UVaLive 3357 Pinary (Fib数列+递归)

谁说我不能喝 提交于 2020-02-28 11:37:45
题意:求第 k 个不含前导 0 和连续 1 的二进制串。 析:1,10,100,101,1000,...很容易发现长度为 i 的二进制串的个数正好就是Fib数列的第 i 个数,因为第 i 个也有子问题,其子问题也就是Fib,这样就可以用递归来解决了。 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring> #include <set> #include <queue> #include <algorithm> #include <vector> #include <map> #include <cctype> #include <cmath> #include <stack> #include <sstream> #include <list> #include <assert.h> #include <bitset> #include <numeric> #define debug() puts("++++") #define gcd(a, b) __gcd(a, b) #define lson

算法之递归-c语言实现

流过昼夜 提交于 2020-02-28 11:13:36
文章来源: http://blog.seclibs.com/算法之递归-c语言实现/ 在上一篇文章里说了递归,这里就使用其中的上楼梯问题来进行代码实现,在上一篇文章里也说过了中间会有重复计算的情况,这里我们使用一维动态数组来进行存储,一维数组的索引值就与楼梯层数相同,可以更加清晰的理解其中的含义,代码如下 如果需要下载代码,请移步至文末 代码: GitHub 文章首发公众号和个人博客 公众号:无心的梦呓(wuxinmengyi) 博客: http://blog.seclibs.com/ 来源: oschina 链接: https://my.oschina.net/u/3677719/blog/3162945

python练习之递归

主宰稳场 提交于 2020-02-28 09:37:16
使用递归编写一个 power() 函数模拟内建函数 pow(),即 power(x, y) 为计算并返回 x 的 y 次幂的值: def power ( x , y ) : if y : return x * power ( x , y - 1 ) else : return 1 print ( power ( 2 , 3 ) ) 使用递归编写一个函数,利用欧几里得算法求最大公约数,例如 gcd(x, y) 返回值为参数 x 和参数 y 的最大公约数: def gcd ( x , y ) : if y : return gcd ( y , x % y ) else : return x print ( gcd ( 4 , 6 ) ) 使用递归编写一个十进制转换为二进制的函数(要求采用“取2取余”的方式,结果与调用bin()一样返回字符串形式): def Dec2Bin ( dec ) : result = '' if dec : result = Dec2Bin ( dec // 2 ) return result + str ( dec % 2 ) else : return result print ( Dec2Bin ( 62 ) ) 写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。举例:get_digits(12345) ==> [1,

算法之递归

孤街浪徒 提交于 2020-02-28 07:41:38
文章来源: http://blog.seclibs.com/算法之递归/ 递归是一种应用非常广泛的算法,在很多的数据结构和算法的编码中都会用到,理解递归是非常重要的。 递归在平时的生活中也是非常常用的,当你排队的时候需要知道自己排在第几个位置,而前面的人又比较多,你不能自己数出来,就可以询问你前一个人他的位置,在他的位置基础上加一便是你的位置,那如果他也不知道他的位置呢,就可以用同样的方法,继续向前询问,直到第一个人,第一个人就不用往前问了,他直到自己是第一个,这个过程就是一个递归的过程。 去问的时候叫做“递”,返回来的时候叫做“归”,假设自己是第n排,求自己位置的函数为f(n),f(n-1)就是前一个人的位置,我们的位置就是f(n-1)+1,同样前一个人的位置也可以用这个公式来计算, 直到第一个人f(1)=1,这一整套流程便是递归的实际利用,编写成代码如下 在编写递归代码的时候,有两点必要的条件: 一个问题可以分解为多个结构相同,规模不同的子问题。 存在终止条件。 如果结构不同,那就不能构造递归了;如果不存在终止条件的话,将会无限循环,看上面的那个例子,它的终止条件就是执行到第一个人的时候,开始往后返回。 递归就这样完成了,上面这个例子是只有一个递归调用的分支,还是比较好理解的,如果有多个递归分支的话,单纯靠人脑是很难理解清楚的,计算机比较适合做重复的工作

汉诺塔解法解析

时间秒杀一切 提交于 2020-02-28 02:20:14
汉诺塔: 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 简单描述:将 A 上 N 个盘子经过 B 移动到 C。 首先考虑最简单的情况,A 柱上只有一个圆盘,这时候只需要将该圆盘从 A --> C 即可。 然后考虑 A 柱上有两个圆盘, 这时候需要将第一个圆盘 A --> B ,然后将第二个圆盘 A --> C ,最后 B --> C,就完成了移动。 关键一步,谨记递归的思想是不考虑细节。 现在有 N 个圆盘,我们需要将其分为两部分,第 N 个圆盘和第 N-1 以上的圆盘,比如现在 N=4,那么就将圆盘分为 [4, (3,2,1)] 两部分,按照第二步中的想法,我们的思想是 (3,2,1) 移动到 B,然后将 4 移动到 C,最后将(3,2,1) 移动到 C 完成。 现在的问题是 (3,2,1) 并不是一个圆盘,我们要将 (3,2,1) 移动到 B,就可以将此抽象为另一个汉诺塔问题,将 A 上 N-1 个盘子经过 C 移动到 B。 解法: 所有的递归问题都由两部分组成: 基础情况 和 递归情况 基础情况简单来说就是该递归函数的终点