递归函数

LeetCode 100——相同的树(递归)

南楼画角 提交于 2020-01-04 00:11:33
一、题目介绍 给定两个二叉树,编写一个函数来检验它们是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1: 输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3] 输出: true 示例 2: 输入: 1 1 / \ 2 2 [1,2], [1,null,2] 输出: false 示例 3: 输入: 1 1 / \ / \ 2 1 1 2 [1,2,1], [1,1,2] 输出: false 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/same-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 二、解题思路 本题采用递归的方法,遍历树的每一个节点,并进行比较。 三、解题代码 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool isSameTree(TreeNode* p,

74-递归函数2:tree功能显示

廉价感情. 提交于 2020-01-02 22:30:41
使用递归函数实现tree功能显示目录结构: import os import sys def list_files(path): if os.path.isdir(path): print(path + ':') content = os.listdir(path) print(content) for fname in content: fname = os.path.join(path, fname) list_files(fname) if __name__ == '__main__': list_files(sys.argv[1]) # python3 dir.py /data/weblog 结果输出: hejianping@VM-0-2-ubuntu:~$ python dir.py /data/weblog /data/weblog: ['nginx'] /data/weblog/nginx: ['my-sweetheart.cn.error.log', 'www.test.com.error.log', 'www.test.com.access.log', 'my-sweetheart.cn.access.log'] hejianping@VM-0-2-ubuntu:~$ tree /data/weblog/ /data/weblog/ └── nginx ├──

C语言 递归计算Ackermenn函数

ぐ巨炮叔叔 提交于 2019-12-30 01:07:44
题目描述 本题要求实现Ackermenn函数的计算,其函数定义如下: 函数接口定义: int Ack( int m, int n ); 其中m和n是用户传入的非负整数。函数Ack返回Ackermenn函数的相应值。题目保证输入输出都在长整型范围内。 裁判测试程序样例: #include <stdio.h> int Ack( int m, int n ); int main() { int m, n; scanf("%d %d", &m, &n); printf("%d\n", Ack(m, n)); return 0; } /* 你的代码将被嵌在这里 */ 输入 输入m、n,m,n是非负整数 输出 输出Ackermenn(m,n)的相应值 样例输入 Copy 2 3 样例输出 Copy 9 代码 # include <stdio.h> int Ack ( int m , int n ) ; int main ( ) { int m , n ; scanf ( "%d %d" , & m , & n ) ; printf ( "%d\n" , Ack ( m , n ) ) ; return 0 ; } int Ack ( int m , int n ) { int s ; if ( m == 0 ) return s = n + 1 ; if ( n == 0 && m > 0 )

C语言 递归实现指数函数

主宰稳场 提交于 2019-12-29 17:23:13
题目描述 本题要求实现一个计算xn(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; } /* 你的代码将被嵌在这里 */ 输入 题目要求输入x,n(n>=1)输出按题目要求输出xn ,题目保证结果在双精度范围内。 样例输入 Copy 2 3 样例输出 Copy 8 代码 double calc_pow ( double x , int n ) { if ( n == 0 ) return 1 ; else { return x * calc_pow ( x , n = n - 1 ) ; } } 来源: CSDN 作者: Qianzhanshuo 链接: https://blog.csdn.net/Qianzshuo/article/details/103751528

递归下降法的语法分析器-3-编译原理

吃可爱长大的小学妹 提交于 2019-12-27 21:18:48
递归下降法的语法分析器 一、实验目的 掌握语法分析器的构造原理,掌握递归下降法的编程方法。 二、实验内容 用 递归下降法 编写一个语法分析程序,使之与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。(注意,需要改写文法,消除左递归等) program → block block → { stmts } stmts →  stmt stmts | e stmt → id = expr ; | if ( bool ) stmt | if ( bool ) stmt else stmt | while ( bool ) stmt | do stmt while ( bool ) ; | break ; | block bool → expr < expr | expr <= expr | expr > expr | expr >= expr | expr expr → expr + term | expr - term | term term → term * factor | term / factor | factor factor → ( e xpr ) | id | num   三、实验要求 1.个人完成,提交实验报告。 2.实验报告中给出采用测试源代码片断,及其对应的最左推导过程(形式可以自行考虑)。 程序片断 { i = 2; while (i

重读算法导论之算法基础

本小妞迷上赌 提交于 2019-12-27 14:51:32
重读算法导论之算法基础 插入排序 ​ 对于少量数据的一种有效算法。原理: 整个过程中将数组中的元素分为两部分,已排序部分A和未排序部分B 插入过程中,从未排序部分B取一个值插入已排序的部分A 插入的过程采用的方式为: 依次从A中下标最大的元素开始和B中取出的元素进行对比,如果此时该元素与B中取出来的元素大小关系与期望不符,则将A中元素依次向右移动 ​ 具体代码如下: public static void insertionSort(int[] arr) { // 数组为空或者只有一个元素的时候不需要排序 if (arr == null || arr.length <= 1) { return; } // 开始插入排序,先假设元素组第一个元素属于已经排好序的A部分,依次从B部分取出元素,进行比较插入 for (int j = 1; j < arr.length; j++) { int key = arr[j]; int i = j - 1; for (; i >= 0; i--) { if (arr[i] > key) { arr[i + 1] = arr[i]; } else { break; } } arr[i+1] = key; } } ​ 易错点为,最后应该是设置arr[i + 1] = key。 可以设想假设A中所有元素都比B中选出来的数小的时候

Contest100000586 - 《算法笔记》4.6小节——算法初步->two pointers

大憨熊 提交于 2019-12-27 00:43:45
常用模板 two pointers:利用问题本身与序列的特性,使用两个下标 i,j 对序列进行扫描(可以同向扫描,也可以反向扫描),以较低的复杂度(一般是 O ( n ) O(n) O ( n ) )解决问题。 定和问题 给定一个 递增 的 正整数序列 和一个正整数M,求序列中的两个 不同位置 的数a和b,使得它们的和恰好为M,输出 所有 满足条件的方案。 模板如下: while ( i < j ) { if ( a [ i ] + a [ j ] == m ) { cout << i << ' ' << j ; ++ i ; -- j ; } else if ( a [ i ] + a [ j ] < m ) ++ i ; else -- j ; } 由于 i 的初值为0,j 的初值为n - 1(i,j 分别指向序列的第一个和最后一个元素),而 i 只递增,j 只递减,循环当 i >= j 时停止,因此 i 和 j 的操作最多为n次。即时间复杂度为 O ( n ) O(n) O ( n ) 。 序列合并问题 假设有两个递增序列A与B,要求将它们合并为一个递增序列C。设置两个下标 i 和 j,初值均为0,分别指向序列A和序列B的第一个元素。 int Merge ( int A [ ] , int B [ ] , int C [ ] , int n , int m ) { int i

递归函数将一个正整数的各位由高到低依次输出

£可爱£侵袭症+ 提交于 2019-12-25 23:38:17
递归函数将一个正整数的各位由高到低依次输出 编写思想 测试程序 编写思想 朋友向我请教了个题。如题目,花了一点时间把他编写成功了。下面我来说说我是怎么实现的。 思想:从高到低依次输出,也就是说若输入的数字是361,那么输出的数字为631。平常排列数的时候一般用冒泡法啊什么的,但是都必须知道数的大小;而这里只有一个整数,那么我们可以把他先拆分为单一的数字,直到拆分到最后2个数字时候,就开始排序如输入数字为:3654。先从个位一个一个拆分,按顺序拆分出来的结果就是4、5、6、3。最后一次拆出来的数字分别是6和3,先排序。排序出来结果时候63。接着返回上一层,怎么样把5加入到63呢。分3种情况;第一种就是比6大,应该放在最前面;第二种就是比3小,放在最后面;最后一种情况就是放在中间。那么问题来了。怎么知道这个数字是放在那里的;我们在把63拆分,从最小的拆分起。依次比较。最后根据情况来把5放进去。 接下来是代码展示。代码已经经过测试。 测试程序 代码写的不是很规范… int rank_num ( int num ) { int a = num / 10 ; int b = num % 10 ; if ( b == 0 ) return a ; int c ; int d = 1 ; if ( a > 10 ) { c = a = rank_num ( a ) ; for ( ; ; ) {

用递归的方法实现无限极分类

和自甴很熟 提交于 2019-12-25 18:53:44
通常我在写项目的时候,在写一些例如商城分类的时候会实现对应分类的上级分类,或者其它项目部门管理的上级部门的时候一般就会用到无限极分类来进行分类 第一步:首先在数据表设计的时候,如果要实现无限极分类,一般我会在数据表多添加一个字段pid,下面我通过一张新建的数据表来说明一下, (1)建表: -- ---------------------------- -- Table structure for pid -- ---------------------------- DROP TABLE IF EXISTS `pid`; CREATE TABLE pid ( id tinyint unsigned NOT NULL AUTO_INCREMENT primary key comment '主键id', name varchar(32) NOT NULL, nickname varchar(32) DEFAULT NULL, pid tinyint(10) unsigned DEFAULT NULL, sort mediumint(10) unsigned DEFAULT 50 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; (2)插入数据: -- ---------------------------- -- Records of pid -- -----

【多项式】FFT

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-25 03:55:13
【多项式】FFT Preface 本文对所有 \(\LaTeX\) 编译后生成的文本共有大约 \(7000\) 字,其中前半部分为前置知识部分,介绍了多项式的有关概念、运算法则以及复数的概念、运算法则以及单位根有关内容,并证明了蝴蝶操作所用到的有关复数的两个重要引理公式。如果你对上述内容已经有了解,可以跳过 Pre-knowledge 部分。 Pre-knowledge 部分大约有 \(2000\) 字。 由于内容比较长,本文还没有经审阅人完全审阅完成,如果您发现了文本中的错误,请私信或评论我指出。 Pre-knowledge 多项式 Definition 称一个关于 \(x\) 的式子 \[f(x) = \sum_{i = 0}^{n} a_i \times x^i\] 为一个 \(n\) 次多项式,其中 \(a_i\) 为常数。称 \(n\) 为 \(f(x)\) 的次数。显然, \(f(x)\) 可以看做一个关于 \(x\) 的 \(n\) 次函数 \(y = f(x)\) 。 回忆初中解析几何最后一个大题的第一问,正常情况下都是给定三个点的坐标,求一个关于 \(x\) 的二次曲线解析式方程。而类似的如果求一条直线的解析式,则需要给出两个点的坐标。 类似的,对于如果想要确定一个 \(n\) 次函数的解析式,则需要 \(n + 1\) 个点的坐标。这是因为一个 \(n\)