递归函数

八大排序(三)-------快速排序

蹲街弑〆低调 提交于 2020-03-06 08:59:47
快速排序法介绍: 快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 感觉自己能力并不足以将一个问题,或算法讲解的足够清楚,只是在别人的基础上理解,明白了代码的含义,知道了执行的流程,知道了原理,但是要我自己讲述,或者深入的说出其底层原理,做不来 所以很多内容粗糙且模糊,见谅 所以这下面的是我参考的别人的讲解,来源忘了 假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列。 3 1 2 5 4 6 9 7 10 8 在初始状态下,数字6在序列的第1位。我们的目标是将6挪到序列中间的某个位置,假设这个位置是k。现在就需要寻找这个k,并且以第k位为分界点,左边的数都小于等于6,右边的数都大于等于6。想一想,你有办法可以做到这点吗? 给你一个提示吧。请回忆一下冒泡排序,是如何通过“交换”

递归实现指数型枚举

落花浮王杯 提交于 2020-03-03 01:22:07
从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。 输入格式 输入一个整数n。 输出格式 每行输出一种方案。 同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。 对于没有选任何数的方案,输出空行。 本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。 数据范围 1≤n≤15 输入样例: 3 输出样例: 3 2 2 3 1 1 3 1 2 1 2 3 思路: 虽然暴力做法可以实现,但是位运算+深度优先搜索为本题的最优解 代码: # include <iostream> using namespace std ; int n ; void dfs ( int u , int state ) //递归函数 { if ( u == n ) //当遍历到末尾时结束 { for ( int i = 0 ; i < n ; i ++ ) if ( state >> i & 1 ) //判断:状态值为1 时执行输出; cout << i + 1 << ' ' ; cout << endl ; return ; } //该点遍历结束后转向下一点 ,根据该点状态是否记为1分为两类; dfs ( u + 1 , state ) ; dfs ( u + 1 , state + ( 1 << u ) ) ; } int main ( ) { cin >> n ; dfs

递归遍历磁盘文件路径、模拟抽奖、线上解析json

匆匆过客 提交于 2020-03-02 21:45:24
今天机试的三个小题目 1、 递归遍历 磁盘文件路径 使用递归方法,遍历D盘 (也可以更换成别的目录,效果达到即可) 下全部的文件(包括子文件夹下的文件),输出文件路径,文件修改时间,文件按修改时间倒序排列。 package test; import java.io.File; import java.util.*; /** * Created by shimengru on 2020/3/2. * 使用递归遍历apache目录下所有文件的文件名 */ public class ShowFileDir { public static void main(String[] args) { File file = new File("/Users/admin/Downloads/apache-maven-3.6.2/"); //校验路径是否为空 File[] files = file.listFiles(); if (files == null) { System.out.println("请输入正确路径..."); return; } File[] fs = seachFileDir(file);//查询后未排序 //进行排序 Arrays.sort(fs, new CompareByLastModified()); //遍历 for (File f : fs) { System

二叉树的非递归遍历与层次遍历

孤人 提交于 2020-03-01 13:50:44
二叉树的递归遍历很好写,也很好理解。但因为是递归程序,不可避免地需要调用系统栈,耗时较长,这里我们来探究一下二叉树的非递归遍历的算法。这种方法需要使用栈这种数据结构,这里关于栈的一些操作函数可以看成伪代码吧,先给出线序、中序、后序遍历的代码即说明。 先序遍历: 1 void PreOrderTraverse(BinTree b) 2 { 3 InitStack(S);///初始化创建栈 4 BinTree p=b;///p为工作指针 5 while(p||!isEmpty(s)) 6 { 7 while(p)///到最左下的孩子 8 { 9 printf(" %c ",p->date);///先序先遍历结点 10 Push(S,p);///入栈 11 p=p->lchild; 12 } 13 if(!isEmpty(s))///在栈不为空的情况下,左孩子为空,弹出该结点,遍历右孩子 14 { 15 p=Pop(s); 16 p=p->rchild; 17 } 18 } 19 } 再给出使用数组模拟的函数 1 void Preorder_n(BiTree bt) /*先序遍历的非递归算法*/ 2 { 3 BiTree stack[MAX],p; 4 int top=0,i; 5 for(i=0; i<MAX; i++) 6 { 7 stack[i]=NULL; /*初始化栈*/ 8

NOIP学习之递归:103.求f(x,n)

烈酒焚心 提交于 2020-03-01 03:34:32
【题目描述】 已知 计算f的值。 【输入】 输入x和n。 【输出】 函数值,保留两位小数。 【输入样例】 4.2 10 【输出样例】 3.68 # include <iostream> # include <cmath> using namespace std ; float cal ( float , int ) ; int main ( ) { int n ; float x , result ; cin >> x >> n ; result = cal ( x , n ) ; printf ( "%.2f" , result ) ; return 0 ; } float cal ( float x , int n ) { if ( n == 1 ) return sqrt ( 1 + x ) ; else return sqrt ( n + cal ( x , ( n - 1 ) ) ) ; } 来源: CSDN 作者: 青蜓派创客 链接: https://blog.csdn.net/wlxiong/article/details/104572386

1231 实验四 递归下降语法分析程序设计

筅森魡賤 提交于 2020-02-29 08:12:05
#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define READ(ch) ch=getc(fp) /*宏:READ(ch)*/ char ch; /*声明为全局变量*/ int right=0; FILE *fp; struct struCH{ char ch; struct struCH *next; }struCH,*temp,*head,*shift; /*head指向字符线性链表的头结点*/ /*shift指向动态建成的结点(游标)*/ void E(); void E1(); void T(void); void T1(void); void F(void); void main(int argc,char *argv[]) { void E (); /* P(E) */ void E1(); /* P(E')*/ void T (); /* P(T) */ void T1(); /* P(T')*/ void F (); /* P(F) */ int errnum=0,k=0,m=0,countchar=0,rownum; int charerr=0; /*开关控制量*/ if((fp=fopen(argv[1],"r"))==NULL) { printf("\n\tCan not open

剑指Offer刷题总结

你。 提交于 2020-02-28 21:50:31
1. 二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路题 从右上角或者左下角开始缩小范围。 2. 替换空格 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 语法题 3. 从尾到头打印链表 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 头插法 数组反转 栈 递归 4. 重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 递归 API:Arrays.copyOfRange() 5. 用两个栈实现队列 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 简单题 6. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5

fib函数用迭代替换递归

五迷三道 提交于 2020-02-28 11:36:31
fib函数递归实现: long Fib(long n) { if (n <= 1) { return n; } else { var t1 = Fib(n - 1); var t2 = Fib(n - 2); return t1+ t2; } } fib函数改为迭代: class Class1 { class Node { public Node(long n, int pos) { this.n = n; this.retStatus = pos; } public long n; //参数 public int retStatus; //0,表示temp中没有保存值 //1, 表示temp中保存了栈顶记录的t1值。 //2,表示temp中保存了栈顶记录的t2值。 public long ret; //返回值 public long t1; //存第一次调用Fib的返回值 public long t2; //存第二次调用Fib的返回值 } long Fib(int n) { long temp = 0; var s = new Stack<Node>(); s.Push(new Node(n, 0)); while (s.Count > 0) { Node top = s.Peek(); switch (top.retStatus) { case 0: if (n <= 1) {

6-3 递归实现指数函数 (15分)

我的未来我决定 提交于 2020-02-27 09:47:37
本题要求实现一个计算pow(x,n) (n≥1)的函数。 函数接口定义: double calc_pow( double x, int n ); 函数calc_pow应返回x的n次幂的值。建议用递归实现。题目保证结果在双精度范围内。 裁判测试程序样例: # include <stdio.h> double calc_pow ( double x , int n ) ; int main ( ) { double x ; int n ; scanf ( "%lf %d" , & x , & n ) ; printf ( "%.0f\n" , calc_pow ( x , n ) ) ; return 0 ; } /* 你的代码将被嵌在这里 */ 输入样例: 2 3 输出样例: 8 ans double calc_pow ( double x , int n ) { double res = 1 ; while ( n != 0 ) { if ( n & 1 ) res * = x ; n >>= 1 ; x * = x ; } return res ; } 来源: CSDN 作者: Lopka 链接: https://blog.csdn.net/Lopka/article/details/104526323

递归生成指定节点数目的树

主宰稳场 提交于 2020-02-26 10:14:45
做测试的时候需要用随机生成的树, 并且能指定节点个数 算法思路 一, 对一个数字进行分割 对数字N, 将其分割为最多M个数字之和 想象有N个小球排成一列, 有N-1个空挡, 随机找M-1个空挡放入挡板, 在第一个小球前面, 和最后一个小球后面也放上挡板, 这样就有了M+1个挡板, 相邻两个挡板之间的距离就是分离出来的树, 如果有两个挡板在同一位置, 说明, 分离出来的数字中含有0 二, 前序递归建树 对于递归函数而言, buildTree(n) 表示 返回有n个节点树, 则n===1时 直接返回一个节点, n>1 时表示该节点含有子树, 需要进行拆分后, 依次创建子节点, 由于采用前序生成, 所以前序遍历的id序列即为增序序列 function splitInt(n, count) { let list = [...Array(count - 1)] .map(_ => Math.floor(Math.random() * n)) .sort((a, b) => a - b) list.push(n) list.unshift(0) let res = [] for (let i = 1; i <= count; i++) { res.push(list[i] - list[i - 1]) } return res } class Node { constructor(id,