递归算法

2019.10.24——树的子结构

匆匆过客 提交于 2019-12-02 06:25:00
文章目录 题目描述 题目思路 代码 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 题目思路 这题相当于在集合A中找是否存在集合B,而这题又涉及到树的结构,一想到树,我们很容易想到递归算法,因为关于树的很多算法都采用的是递归的思想,那么这题我们能不能使用递归的想法呢?这里的话我们采取先序+递归的联合思想。首先,我们将A和B的根相比较,如果一致再比较左右子树,当然可能A,B的根并不相等,那么我们要把B的根与A的左右子树进行比较,找到一致的后,再将B的左右子树与A中一致的节点的左右子树进行比较。大致思路就是这样,下面可以看代码我再进行讲解。 代码 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public : bool HasSubtree ( TreeNode * pRoot1 , TreeNode * pRoot2 ) { bool flag = false ; //判断是否找到 if ( pRoot1 && pRoot2 ) //因为A为空或者B为空或者 /

用递归算法进行二分查找

陌路散爱 提交于 2019-12-02 06:21:32
用递归进行二分查找(C语言) #include<stdio.h> #include<stdlib.h> #define N 100 /*递归二分查找*/ int compare(const void *value1, const void *value2) { // 升序 return (*(int*)value1 - *(int*)value2); } int f(int a[], int p, int x,int y){ while( y > x){ int mid = (y - x)/2 +x; if(p == a[mid] ) return mid; if(p>a[mid]) return f(a,p,x+1,y); else return f(a,p,x,y-1); } return -1; } int main(){ int a[N],p,m; printf("你想输入几个数:"); scanf("%d", &m); printf("请输入数组里面的数: \n"); for(int i = 0; i<m; i++){ scanf("%d", &a[i]); } qsort(a, m, sizeof(int), compare); printf("排序后的数:\n"); for(int j = 0; j< m; j++) { printf("%d ", a[j]); }

动态规划总结

a 夏天 提交于 2019-12-02 02:34:27
---恢复内容开始--- 动态规划来源于分治法,本质是为了节省递归栈所消耗的时间/空间,同时把相同的子问题的解记录下来,防止系统做重复工作,浪费时间。 一般用动态规划做题时候,要从分治法开始,进一步考虑是否存在相同的子问题解且解是否重复,如果有可以采用动态规划求解【当然递归方程还是要写的】。 动态规划的递归方程和分治法略有不同,动态规划的递归一般都用二维数组储存数据【当然也有用一维数组甚至一个变量的,不过都是二维数组的简化版】,首先我们要弄清楚m[i][j]的几何意义,然后根据题目要求写出m[i][j]=...【一般都是和m其他元素挂钩的】,这就是动态规划的递归方程。 一般写递归方程分为以下几种情况 1.确定规划起点终点,规划方向确定 例题: 7-1 数字三角形 (30 分) 给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。 输入格式: 输入有n+1行: 第 1 行是数字三角形的行数 n,1<=n<=100。 接下来 n行是数字三角形各行中的数字。所有数字在0..99 之间。 输出格式: 输出最大路径的值。 输入样例: 在这里给出一组输入。例如: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 输出样例: 在这里给出相应的输出。例如: 30

算法一看就懂之「 递归 」

那年仲夏 提交于 2019-12-02 02:28:02
之前的文章咱们已经聊过了 「 数组和链表 」 、 「 堆栈 」 和 「 队列 」 ,今天咱们来看看「 递归 」,当然「 递归 」并不是一种数据结构,它是很多算法都使用的一种编程方法。它太普遍了,并且用它来解决问题非常的优雅,但它又不是那么容易弄懂,所以我特意用一篇文章来介绍它。 一、「 递归 」是什么? 递归 就是指函数直接或间接的调用自己,递归是基于栈来实现的。递归的经典例子就是 斐波拉契数列(Fibonacci)。一般如果能用递归来实现的程序,那它也能用循环来实现。用递归来实现的话,代码看起来更清晰一些,但递归的性能并不占优势,时间复杂度甚至也会更大一些。 上图为 斐波拉契数列 图例。 要实现递归,必须满足2个条件: 可调用自己 就是我们要解决的这个问题,可以通过函数调用自己的方式来解决,即可以通过将大问题分解为子问题,然后子问题再可以分解为子子问题,这样不停的分解。并且大问题与子问题/子子问题的解决思路是完全一样的,只不过数据不一样。因此这些问题都是通过某一个函数去解决的,最终我们看到的就是不停得函数调用自己,然后就把问题化解了。 如果这个问题不能分解为子问题,或子问题的解决方法与大问题不一样,那就无法通过递归调用来解决。 可停止调用自己 停止调用的条件非常关键,就是大问题不停的一层层分解为小问题后,最终必须有一个条件是来终止这种分解动作的(也就是停止调用自己)

2019-2020-1学期 20192406 《网络空间安全专业导论》第三周学习总结

纵饮孤独 提交于 2019-12-01 23:31:49
第六章 低级程序设计语言与伪代码 6.1 计算机操作 我们所用的程序设计语言都必须反映出计算机能够执行的操作类型。让我们通过重述计算机的定义来开始新的讨论:计算机是能够存储、检索和处理数据的可编程电子设备。 这个定义中的操作字包括 可编程的 、 存储 、 检索 和 处理 。上一章指出了数据和操作数据的指令逻辑上是相同的,它们存储在相同的地方。这就是“可编程的”这个词的意义所在。操作数据的指令和数据一起存储在机器中。要改变计算机对数据的处理,只需要改变指令即可。 存储、检索和处理 是计算机能够对数据执行的动作。也就是说,控制单元执行的指令能够把数据 存储 到机器的内存中,在机器内存中 检索 数据,在算术逻辑单元中以某种方式 处理 数据。词语“处理”非常通用。在机器层,处理涉及在数据值上执行算术和逻辑操作。 6.2 机器语言 机器语言 :由计算机直接使用的二进制编码指令构成的语言 Pep/8:一台虚拟机 虚拟机 :为了模拟真实机器的重要特征而设计的假想机器 Pep/8反应的重要特征 回忆第5章中所说的,寄存器是中央处理器中算术/逻辑单元的一小块存储区域,它用来存储特殊的数据和中间值。Pep/8有七个寄存器,我们重点研究其中三个: 程序计数器(PC) , 其中包含下一条即将被执行的指令的地址。 指令寄存器(IR) , 其中包含正在被执行的指令的一个副本。 累加器 (是一个寄存器)。

递归

别等时光非礼了梦想. 提交于 2019-12-01 20:54:34
递归方法 待整理,未完… 递归的定义: 递归调用是一种特殊的嵌套调用,是某个函数调用自己或者是调用其他函数后再次调用自己的,只要函数之间相互调用能产生循环的则一定是递归调用。 一个递归算法必须包括 终止条件 和 递归部分 。 相关的题目 递归函数中的形参是() A.自动变量 B.外部变量 C.静态变量 D.可根据需要自动以存储类型 存储类型有: auto static register extern 递归式借助栈来实现的,自动变量是存储在栈里面的,随着递归的进行,自动创建和销毁。 外部变量和静态变量是不能作为递归函数的参数的。自动变量大体上等价于局部变量,但也不完全相同 只有那种使用了局部变量的递归过程在转换成非递归过程时,才必须使用栈() A.对 B.错 递归工作栈里面包括返回地址、本层的局部变量和递归调用的形参代换用实参,所以正常情况下,无论递归过程有没有使用局部变量,转换为非递归过程都需要用栈来模拟这个递归调用过程。 递归程序优化的一般手——尾递归优化 斐波那契数列的两种递归方法 # 一般递归方法 def fab ( n ) : if ( n < 3 ) : return 1 else : return fab ( n - 1 ) + fab ( n - 2 ) # 具有‘线性迭代过程’特性的递归——尾递归过程 def fab1 ( n , b1 = 1 , b2 = 1 ,

阶乘n!(非递归算法)

℡╲_俬逩灬. 提交于 2019-12-01 20:54:00
阶乘n!(非递归算法) #include<stdio.h> int main(){ int n,i,s=1; while(~scanf("%d",&n)) { if(n==0) printf("0!=1\n"); else if(n<0) printf("ERROR\n"); else{ for(i=n;i>0;i--) s*=i; printf("%d!=%d\n",n,s); } } return 0; } 来源: CSDN 作者: Sponge_bob_ 链接: https://blog.csdn.net/Sponge_bob_/article/details/82940236

二分查找的递归实现和非递归实现

限于喜欢 提交于 2019-12-01 20:53:51
二分查找的递归实现和非递归实现【java】 (1)非递归实现二分查找。 算法是由静态方法binarySearch()实现的,它接受一个整数健和一个有序的int数组作为参数。如果该健存在于数组中,则返回他的索引,否则返回-1。 算法使用两个变量lo和hi,并保证如果健在数组中则它一定在a[lo…hi]中,然后方法进入一个循环,不断地将数组的中间健(索引为mid)和被查找的健比较。如果被查找的健等于a[mid],返回mid;否则算法将查找的范围缩小一半,如果被查找的健小于a[mid]就继续在左边查找,如果被查找的健大于a[mid]就继续在右边查找。 算法找到被查找的健,或者是查找范围为空时,该过程结束。 二分查找的时间复杂度O(logn)。 以下为二分查找的详细代码。 import java . util . * ; //导入必要的包。 public class BinarySearch2 { public static int binarySearch ( int [ ] a , int key ) { int lo = 0 ; //指向数组的第一个元素。 int hi = a . length - 1 ; //指向数组的最后一个元素。 while ( lo <= hi ) { int mid = ( lo + hi ) / 2 ; //取数组中间。 if ( key > a [

用静态数组在函数递归过程中保存中间数据(以递归输出斐波那契数列为例——详细注释)

核能气质少年 提交于 2019-12-01 20:52:45
通过建立一个静态数组来保存递归函数调用过程中产生的中间数据,可以规避掉很多不必要的重复计算, 能在很大程度上提高程序的运行效率,尤其是在动态规划等需要递归调用的算法中应用广泛。 下面以递归输出斐波那契数列为例, 通过建立一个静态数组,来使得程序运行避免超时。 #include<stdio.h> long int count[1000];//establish an array to store the temporary data during the recursion calculation. long int fibo(int i) { if (i == 2 || i == 1) return 1; else if(count[i - 1] != 0 && count[i - 2] != 0) { return count[i - 1] + count[i - 2]; }// take a value from the array before assigning a value to the array to reduce the unnecessary judgement. else { count[i - 1] = fibo(i - 1); count[i - 2] = fibo(i - 2); return count[i - 1] + count[i - 2]; }

二分查找算法递归和非递归实现

倾然丶 夕夏残阳落幕 提交于 2019-12-01 20:51:49
自己接触和了解过的查找算法总结起来分为3个吧: 1. 静态查找(主要是二分查找,效率较高) 2. 动态查找(二叉查找树) 3. 哈希表 首先来说二分查找吧! 基本思想: 假设在一个已经排好序的有序序列(N个元素,升序排列),首先让序列N中中间的关键字与需要查找的关键字进行比较,如果相等,则查找成功,否则利用中间位置将序列分成两个子序列,如果待查找的关键字小于中间的关键字,则在前一个子序列中同样的方法进一步查找, 如果待查找的关键字大于中间的关键字,则在后一个子序列中同样的方法进一步查找,重复以上过程一直到查找结束! 时间复杂度:O(log(n)) 空间复杂度:O(1) 代码示例: #include <stdio.h> //二分查找非递归实现 int BinSearch1(int Array[], int low, int high, int key) { int ret = -1; int mid = 0; ret = (Array != NULL) && (low >= 0) && (high > low); printf("Search Key: %d\n", key); if(ret) { while(low <= high) { mid = (low + high)/2; if(Array[mid] == key) { ret = mid; printf(