递归调用

Java小白常问的问题大全

☆樱花仙子☆ 提交于 2019-12-05 03:08:21
Java小白在初学Java时都会遇到各种各样的问题,小编来总结一下一些常见的问题。比如,可以用%除以一个小数吗?a+=b和a=a+b的效果有区别吗?声明一个数组为什么需要花费大量时间?为什么Java库不用随机pivot方式的快速排序? 如果有想学习java的同学,可来我们的java技术学习QQ群的哦:745446493里面免费送整套系统的java教程! 基本数据类型 1.我可以用%除以一个小数吗? 当然可以。比如,如果angle是一个非负数,那么angle%(2*Math.PI)就会把angle转换到0到2π之间。 2.当ab都是基本类型变量时,a+=b和a=a+b的效果有区别吗? 当a和b的类型不同时,那两条语句的效果就可能有区别。a+=b等同于a=(int)(a+b),这种情况下可以是a是int型,b是float型。但是同等情况下a=a+b就会编译报错。 3.为什么-0/3结果是0,而-0.0 /3.0结果是-0.0?(注意后边的结果0带负号) 在Java里,整数是用补码表示的。在补码中0只有一种表示方法。另一方面,浮点数则是用IEEE标准表示的,对于0有两种表示方法,0和-0。 条件语句和循环语句 1.为什么判断字符串相等不能使用==? 这反映了基础类型(int,double,boolean)和引用类型(String)的区别。 2.有没有在什么情况下

[] 递归算法

孤街浪徒 提交于 2019-12-05 03:03:28
3 、基本解题步骤或方法: 1) 明确递归函数功能。一定要明确递归程序的功能,对递归程序要完成的功能模棱两可、一知半解,往往导致逻辑混乱,写不出正确的递归程序。 2) 找出递归终止条件。所谓递归,就是在函数内部代码调用函数本身,所以,我们必须要找出递归的结束条件,否则,就会一直调用自己,陷入死循环。也就是说,我们需要找出当参数为何值时,递归结束。请注意,这个时候我们必须能根据参数的值,直接知道函数的结果是什么。 3) 找出递归等价关系。即找出怎么通过递归把一个大问题分割成若干小问题,通过解决若干个小问题再组合起来,来求解这个大问题。 4) 审视已写好的递归程序,看看递归终止条件是否足够严谨,防止不严谨的递归终止条件导致程序陷入死循环。 4 、例题解析: 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 l、明确递归函数功能 假设函数Solution的功能是求青蛙跳上一个n级的台阶有多少种方法。先定义出函数的框架,如下: // 求青蛙跳上一个n级的台阶,总共有多少种跳法 int Solution(int n) { } 找出递归终止条件 找出递归终止条件,最常用的手法就是压缩问题的规模到很小的程度,小到可以直接算出Solution的返回值。所以,当n = 1时,有: // 求青蛙跳上一个n级的台阶,总共有多少种跳法 int Solution

python 三元表达式和递归

 ̄綄美尐妖づ 提交于 2019-12-05 02:54:55
'''三元表达式 语法: 结果1 if条件 else 结果2 判断条件是否为真,如果真,返回结果1,否则返回结果2 ''' a = 10 b = 20 c = a if a > b else b # 如果a大于b,则返回a,否则返回b print(c) # 20 '''递归:函数自己调用自己''' i = 1 def func(): global i print(i) i += 1 func() func() '''正常情况上面的代码,会一直执行下去,但是Python中有一个规定,函数不可以无限的调用下去。 python中规定默认递归最大深度(最多调用多少层) recursion 递归 ''' import sys print(sys.getrecursionlimit()) # 递归最大深度 '''每次调用一次函数,都需要开辟一个内存,如果无限的这么访问下去,内存容易满。''' 来源: https://www.cnblogs.com/lilyxiaoyy/p/11899870.html

java之语句块、方法与递归

雨燕双飞 提交于 2019-12-05 02:39:25
1 语句块 语句块(有时叫做复合语句),是用花括号扩起的任意数量的简单java语句。 块确定了局部变量的作用域。块中的程序代码,作为一个整体,是要被一起执行的 。块可以嵌套在另一个块中,但是不能在两个嵌套的块内声明同名的变量。语句块可以使用外部的变量,而外部不能使用语句块中定义的变量,因为语句块内的变量作用域仅限于语句块。 2 方法 方法就是一段用来 完成特定功能的代码片段 (相当于特殊的语句块),类似于其他语言的函数。我们可以反复的调用。 方法用来定义该类或该类的实例的行为特征和功能实现。方法是类和对象行为特征的抽象。方法很类似于面向过程中的函数。面向过程中,函数是最基本单位,整个程序由一个个函数调用组成。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。 方法声明格式: [修饰符1 修饰符2 ...] 返回值类型 方法名(形式参数列表){         java语句:... } 方法的调用方式: 对象名.方法名(实参列表) 方法的详细说明: 1. 形式参数:在方法声明时用于接收外界传入的数据。 2.实参:调用方法时实际传给方法的数据。 3.返回值:方法在执行完毕后返还给调用它的环境的数据 4.返回值类型:事先约定的返回值的数据类型,如无返回值,必须指定为void。 1.目前阶段所有方法的修饰符列表统一写成:public static 2

闭包,递归

北城以北 提交于 2019-12-05 02:21:14
1. 不断调用自己本身(自己调用自己)——死循环 最大层次1000,实际测试997/998 2. 有明确的终止条件 满足以上两个才是 有效递归。 递:一直执行直到碰到结束条件 归:从结束条件开始往回退 最大递归深度998 • 1. 闭包是嵌套在函数中的函数。 • 2.闭包必须是内层函数对外层函数变量(非全局变量)的引用。 • 3. 外层函数返回内层函数名 •闭包的作用:保存局部信息不被销毁,保证数据的安全性。 •闭包的应用:装饰器 来源: https://www.cnblogs.com/zuohangyu123/p/11897383.html

数据结构与算法之美学习笔记:第十四讲

我只是一个虾纸丫 提交于 2019-12-05 00:30:27
一、课前问题 几乎所有的编程语言都会提供排序函数,比如C语言中qsort(),C++ STL中的sort()、stable_sort(),还有Java语言中的Collections.sort()。 在平时的开发中,我们也都是直接使用这些现成的函数来实现业务逻辑中的排序功能。那你知道这些排序函数是如何实现的吗?底层都利用了哪种排序算法呢? 基于这些问题,今天我们就来看排序这部分的最后一块内容:如何实现一个通用的、高性能的排序函数? 二、如何选择合适的排序算法 如果要实现一个通用的、高效率的排序函数,我们应该选择哪种排序算法?我们先回顾一下前面讲过的一种排序算法。 我们前面讲过,线性排序算法的时间复杂度比较低,适用场景比较特殊。所以如果要写一个通用的排序函数,不能选择线性排序算法。 如果对小规模数据进行排序,可以选择时间复杂度是O(n )的算法; 如果对大规模数据进⾏排序,时间复杂度是O(nlogn)的算法更加高效。 所以,为了兼顾任意规模数据的排序,一般都会首选时间复杂度是O(nlogn)的排序算法来实现排序函数。 时间复杂度是O(nlogn)的排序算法不止一个,我们已经讲过的有归并排序、快速排序,后面讲堆的时候我们还会讲到堆排序。堆排序和快速排序都有比较多的应用,比如Java语言采用堆排序实现排序函数,C语言使用快速排序实现排序函数。 不知道你有没有发现,

day14-01 函数的递归

萝らか妹 提交于 2019-12-05 00:17:21
一、函数的递归 1.1 函数调用的方式 二、回溯和递归 三、拓展面试(了解) 3.1 python中默认递归深度 TOC 一、函数的递归 单纯的递归调用时没有任何意义 函数的递归是指重复 “直接调用或间接调用” 函数本身,这是一种函数嵌套调用的表现形式。 1.1 函数调用的方式 直接调用 指的是在函数体代码中直接调用函数本身 # 直接调用 def func(): print('你好') func() func() 间接调用 两个函数之间相互调用,间接造成递归 def foo(): print('from foo') goo() def goo(): print('from goo') foo() foo() 二、回溯和递归 想要递归有意义,必须遵守两个条件: 回溯 回溯是指重复的执行,每一次执行都要拿到一个更接近于结果的结果。 回溯必要有一个终止条件 递归 当回溯找到一个终止条件后,开始一步一步往上递推 def age(n): if n == 1: return 18 return age(n - 1) + 2 res = age(5) print(res) 三、拓展面试(了解) 3.1 python中默认递归深度 python中默认递归次数,999或者1000 ps:但是每一台操作系统中会根据硬盘来设置默认递归深度 # 获取递归深度 import sys sys

01玩转数据结构_05_链表和递归

心不动则不痛 提交于 2019-12-04 18:29:05
链表回顾: leetcode 题目(No.203 移除链表元素): 不使用虚拟头节点: 1 class Solution { 2 public ListNode removeElements(ListNode head, int val) { 3 //1,head.val 就是应该删除的节点 4 // if(head != null && head.val == val ){ 5 while(head != null && head.val == val ){ //之所以使用while是因为可能有多个。 6 ListNode delNode = head; 7 head = delNode.next; 8 delNode.next = null; 9 } 10 //2,head.val 不是应该删除的节点 11 if(head ==null){ 12 return null; 13 } 14 ListNode prePtr = head; //删除时应该要知道前一个节点。 15 while (prePtr.next != null){ 16 if(prePtr.next.val == val){ 17 ListNode delNode = prePtr.next; 18 prePtr.next = delNode.next; 19 delNode.next = null; 20

第29课 互斥量与自解锁(std::mutex和lock系列)

北战南征 提交于 2019-12-04 17:55:48
一. 互斥量 (一)Mutex系列类   1. std::mutex:独占的互斥量, 不能递归使用 。   2. std::recursive_mutex: 递归互斥量 。允许同一线程多次获得该互斥锁,可以用来解决同一线程需要多次获取互斥量时死锁的问题。   3. std::time_mutex和std::recursive_time_mutex: 带超时的互斥量 。 前者是超时的独占锁,后者为超时的递归锁 。主要用于获取锁时增加超时等待功能,因为有时不知道获取锁需要多久,为了不至于一直等待下去,就设置一个等待超时时间。比std::mutex多了两个超时获取锁的接口:try_lock_for和try_lock_until //1. 独占互斥锁,不能递归使用 class mutex { public: //std::mutex不支持copy和move操作。 mutex(const mutex&) = delete; mutex& operator=(const mutex&) = delete; constexpr mutex() noexcept; //构造函数:新的对象是未锁的 ~mutex(); void lock(); //上锁 void unlock(); //解锁 bool try_lock(); //尝试上锁。成功,返回true。失败时返回false,但不阻塞

JavaScript 递归遍历json串获取相关数据

◇◆丶佛笑我妖孽 提交于 2019-12-04 17:51:25
递归遍历 json 串获取相关数据 by: 授客 QQ : 1033553122 1. 测试数据 // 导航菜单 [ { id: 1, parentId: 0, parentName: null, name: "首页", url: "/home", perms: null, requireAuth: true, hidden: false, type: 0, icon: "fa fa-home fa-lg",a orderNum: 1, level: 0, children: [ { id: 2, parentId: 1, parentName: null, name: "首页二级菜单1", url: "", perms: null, requireAuth: true, hidden: false, type: 1, icon: "fa fa-home fa-lg", orderNum: 1, level: 0, children: [ { id: 3, parentId: 2, parentName: null, name: "首页三级菜单1", url: "", perms: null, requireAuth: true, hidden: false, type: 1, icon: "fa fa-home fa-lg", orderNum: 1, level: 0,