递归调用

数据结构—平衡二叉树

走远了吗. 提交于 2019-11-26 20:47:15
  二叉排序树集中了数组的查找优势以及链表的插入、删除优势,因此在数据结构中占有一定的地位。但在一定的情况下二叉排序树又有可能变为链表,例如插入从1~100的数,这时进行数据查找的效率就要降低。 为了解决二叉排序树这种左右子树深度不均匀的情况引入了一种平衡二叉树(AVLTree): 任何一个节点的左右子树深度差不超过1 .通过这个限定,阻止了二叉树的左右子树深度差较大的情况,维持了二叉树的稳定。   如何让二叉树的左右子树深度差不超过1呢?这就需要对节点进行旋转,也就是当某个节点的左右子树深度超过1时需要对这个节点进行旋转(旋转之后依旧是左子树小于节点小于右子树),重新调整树的结构。 例如:这两棵二叉树虽然结构不同,但是都是二叉排序树,所谓的旋转就是把左边的深度为3的树旋转为右边深度为2的二叉树。        在平衡二叉树进行插入操作时遇到的不平衡情况有多种,但是这么多种情况都可以分解为一下四中基础情景:把它叫做:左左、左右、右右、右左。 在解释这四种情景之前需要先明白一个定义:最小不平衡节点—插入一个节点之后,距离这个插入节点最近的不平衡节点就是最小不平衡节点(如上图左树的10节点)。所有的旋转都是在最小不平衡节点的基础上进行的。 继续解释四种情景命名意义:左左:节点插入在最小不平衡节点的左子树的左子树上。 左右:节点插入在最小不平衡节点的左子树的右子树上面          

反转链表

試著忘記壹切 提交于 2019-11-26 19:53:33
题目描述 输入一个链表,反转链表后,输出新链表的表头。 非递归方法AC代码: def ReverseList(self, pHead): # write code here prev = None while pHead: curr = pHead pHead = pHead.next curr.next = prev prev = curr return prev 递归方法: def ReverseList(self, pHead, prev=None): if not pHead: return prev n = pHead.next pHead.next = prev return self.ReverseList(n, pHead) 还在思考怎么让递归调用方法中函数只传入一个参数。 来源: https://blog.csdn.net/qq_32895961/article/details/99073593

Spring AOP实现原理(递归拦截器)

时光毁灭记忆、已成空白 提交于 2019-11-26 19:32:47
一、Spring AOP工厂 1. 如果AdvisedSupport通知器没有进行自定义设置,默认使用JDK动态代理 2. 如果AdvisedSupport进行了设置,就判断要代理的类是不是接口,接口使用JDK动态代理,否则使用Cglib动态代理 3. JDK动态代理和Cglib动态代理,都是基于 AdvisedSupport 的 MethodInterceptor 链实现的 @Override public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { Class<?> targetClass = config.getTargetClass(); if (targetClass == null) { throw new AopConfigException("TargetSource cannot determine target class: " + "Either an interface or a target is required for proxy creation

26 方法递归调用

巧了我就是萌 提交于 2019-11-26 19:25:34
什么是递归 递归就是方法自己调用自己,在编写的时候一定要有一个结束条件,否则将会造成StackOverflowError的错误。 看如下示例,计算1~n的和,按照以前所学习的知识,可能你会这样编写代码 public static void main(String[] args){ int n = 5; //调用该方法完成1-N的求和 int result = sum(n); System.out.println(result); } //该方法完成1-N的求和. public static int sum(int n){ int sum = 0; for(int i=0;i<=n;i++){ sum += i; } return sum; } 如果使用递归的话,可以这样写 public static void main(String[] args){ int n = 5; //调用该方法完成1-N的求和 int result = sum(n); System.out.println(result); } //该方法完成1-N的求和. //1+2+3+4+5+...N public static int sum(int n){ if(n==1){ return 1; }else{ return n + sum(n-1); } } 查看大图方法:图片上右键,点击在新标签页中打开图片

浅谈并发与并行(一)

拥有回忆 提交于 2019-11-26 18:41:04
一、引言 前天在 GitHub 上看到一幅图,问如何向五岁的小孩讲解并发和并行。然后有人以这幅图做答: 这幅图有点儿意思,用咖啡机的比喻来形容并发和并行,从中最直接的体会是,并发是有状态的,某一线程同时执行一个任务,完了才能进行到下一个,而并行是无状态的。 近些年,计算机的处理能力成指数能力增长。处理能力也越来越快,以前的一些工作站现在都可以移植到笔记本电脑或者手持设备上。但是近几年,由于处理器的处理速度已经达到了极限,所以处理器开始向多核方向发展,而提高程序性能的一个最简单的方式之一就是充分利用多核处理器的计算资源。但要编写利用多核处理器处理的程序并不那么简单。所以一些函数是编程语言,如F#,Scala,Erlang等又开始流行起来,因为他们带来的不可变性,递归思想等在一定程度上简化了并行和并发编程。 本文和下文从任务并行和数据并行两个方面,简要讨论一下.NET中的并行编程。这篇文章不可能讲完所有的API,框架,工具或者设计模式。对着方面感兴趣的同学可以看看专门的书籍如Concurrent Programming on Windows 、Concurrency and Parallelism in .NET, 这些书专门讲解了.NET中的并发和并行编程,本文主要参考.NET Performance 一书的部分章节。 二、问题及挑战 对于并行

C++ 递归调用遍历目录树 Windows API【转】

守給你的承諾、 提交于 2019-11-26 18:32:48
原文:http://www.cnblogs.com/lailx/archive/2011/11/20/2256380.htm l #include <windows.h> #include <stdio.h> /* 预处理申明 */ //#pragma comment (lib, "User32.lib") /* 函数申明 */ DWORD ListAllFileInDrectory(LPSTR szPath); /* 全局变量 */ //记录所有的文件和目录数 DWORD dwTotalFileNum = 0; /* ************************************ * DWORD ListAllFileInDrectory(LPSTR szPath) * 功能 遍历目录及所有子目录,打印路径 * * 参数 LPTSTR szPath,为需遍历的目录 * * 返回值 0代表执行完成,1代码发生错误 **************************************/ DWORD ListAllFileInDrectory(LPSTR szPath) { CHAR szFilePath[MAX_PATH]; WIN32_FIND_DATA FindFileData; HANDLE hListFile; CHAR szFullPath[MAX

抽象

主宰稳场 提交于 2019-11-26 17:52:08
我个人认为可以将其与函数的定义结合起来理解,即尽可能的将实现细节隐藏,在我们实现该函数的功能时,可以通过较为直观的方式去调用它实现这个功能,但是不需要你展现其实现的每一步骤。书上的一段结合我们日常生活常场景的话我认为可能更有助于理解: 例如,如果你向人打听怎么去电影院,就不希望对方回答:“向前走10步,向左 转90度,接着走5步,再向右转45度,然后走123步。”听到这样的回答,你肯定一头雾水。 如果对方回答:“沿这条街往前走,看到过街天桥后走到马路对面,电影院就在你左边。”你 肯定能明白。这里的关键是你知道如何沿街往前走,也知道如何过天桥,因此不需要有关这些方 面的具体说明。 作用域 这里的“域”很好理解,也就是范围的意思,而作用域又分为全局作用域和局部作用域,而当我们定义函数的时候,每个函数都会创建一个局部变量,而局部变量的作用范围也仅限与该函数内部: def name_test ( ) : x = 1 而全局变量也就是作用范围在全局的变量,但是当函数内定义的变量与全局变量同名的话,在函数内直接调用的就是局部变量值,其对全局变量进行了遮盖,若是想在函数内调用全局变量的值,可使用函数 globels 对全局变量进行调用。 其中还涉及到的一个概念是 作用域嵌套 ,就是将一个函数放在另一个函数内。 递归 在之前系列的文章中介绍过如何调用函数,而递归则是函数调用其自身

递归调用

跟風遠走 提交于 2019-11-26 17:44:40
递归列举 printd(123)时,第一次调用printd的参数n = 123.它把12传递给printd的第二次调用,后者 又把1传递给printd的第三次调用。第三次调用printd时首先将打印1,然后再返回到第二次调 用。从第三次调用返回后的第二次调用同样也将先打印2,然后再返回到第一次调用。返回到 第一次调用时将打3,随之结束函数的执行。 void printd(int n) {    if (n < 0)   {     putchar('-');     n = -n;   }    if (n / 10)   printd(n / 10);   putchar(n % 10 + '0'); } 举123为例子 int strcmp(char *s , char *t) {   int i;    for (i = 0 ; s[i] == t[i] ; i++)   return 0;    return s[i] - t[i]; } 原型声明: extern char *strcpy(char *dest , const char *src); 功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间容纳src的字符串。 返回指向dest的指针。 int

十三、递归及反射

徘徊边缘 提交于 2019-11-26 17:39:10
递归原理:递归要慎用 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368 我们发现其规律为:后一个数等于它前面两个数之和 需求: 打印出如上所述序列: def func(arg1,arg2): if arg1 == 0: print (arg1, arg2) arg3 = arg1 + arg2 print (arg3) func(arg2, arg3) func(0,1) 递归的特点就是函数自己调用自己 典型的应用就是通过递归实现简单计算功能: 如下,需要计算这个的值 a = '1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))' def handle(a): #获取只包含数字和+-*/ #1-2*((60-30+( #我把它截断成三段 #-40/5 = -8 #先把这个-40/5的值算出来 #)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2)) #第三段 #b = 新表达式 handle(b) handle(a) ================

Java递归练习201908091049

拜拜、爱过 提交于 2019-11-26 16:09:22
package org.jimmy.autofactory.test; public class TestRecursive20190809 { public static void main(String[] args) { test(3); } public static void test(int n) { if(n > 0) { test(n - 1); } System.out.println(n); } } 个人分析(可能不对): 第一步,3 > 0,调用test(3 - 1),test(2 - 1),test(1 - 1).此时,打印0. 因为这个方法最后一行才结束,所以这个方法另一个分支是.test(2 - 1),打印1,test(3 - 1)打印2,最后test(3)打印3. 来源: https://www.cnblogs.com/JimmySeraph/p/11325827.html