递归调用

javascript中的递归函数

柔情痞子 提交于 2020-03-12 04:15:20
正常的递归函数如下: 1 function factorial(num){ 2 if(num <= 1){ 3 return 1; 4 }else{ 5 return num * factorial(num-1); 6 } 7 } 这个函数表面看起来还ok,但如果我们执行下面代码就会出错。 1 var jenny = factorial; 2 factorial = null; 3 alert(jenny(4)); // 出错 代码分析: 变量jenny中保存factorial函数的引用,而变量factorial被设置为null, 在调用jenny时,factorial已不再指向函数的引用,所以会出错。 此时我们可改用arguments.callee可以解决此问题。 function factorial(num){ if(num <= 1){ return 1; }else{ return num * arguments.callee(num-1); } } arguments.callee:是一个指向正在执行的函数的指针。 注:在编写递归函数时,使用arguments.callee比直接使用函数名保险,但在严格模式下,使用arguments.callee会导致错误。 所以我们可以使用命名函数表达式来实现相同的效果。 1 var factorial = (function f

DAY2 50.Pow(x,n) (二分查找+递归)

非 Y 不嫁゛ 提交于 2020-03-12 03:51:35
1.题目描述 实现 pow(x, n) ,即计算 x 的 n 次幂函数。 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例 2: 输入: 2.10000, 3 输出: 9.26100 示例 3: 输入: 2.00000, -2 输出: 0.25000 解释: 2-2 = 1/22 = 1/4 = 0.25 说明: -100.0 < x < 100.0 n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。 2. 思路 1.暴力法:暴力递归,累乘,o(n) 2. 采用二分查找+递归的思想,简化计算复杂度 o(logn) 利用二分查找: 将幂次n/2;计算A = pow(x,n/2)的结果: 若n为偶数,返回 A*A; 若n为奇数,返回A*A*x; 最后再用递归调用完成,递归的边界条件是 n=0,return 1.0; 还有一个注意是: 1.当n为复数时,将转换为正数后再计算并且将 x装换为 1/x; 3.代码实现 class Solution { public: double myPow(double x, int n) { /* 思路: 参考昨天的做法,将计算 平方的平方的平方。。。 1.特殊情况考虑 n<0,用1/n计算; */ long long N = n; if(N<0) { x = 1/x; N = -N; }

递归的四条基本法则

房东的猫 提交于 2020-03-11 10:44:16
在编写递归程序时,关键是要牢记递归的四条基本法则: 1、基准情形。必须总有某些基准情形是不用递归就能求解的。 2、不断推进。对于那些需要递归求解的情形,递归调用必须总能朝着基准情形的方向推进。 3、设计法则。假设所有的递归调用都能运行。 4、合成效益法则。在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作。 来源: CSDN 作者: ThetaQing 链接: https://blog.csdn.net/Thera_qing/article/details/104790132

速读原著-TCP/IP(高速缓存)

╄→尐↘猪︶ㄣ 提交于 2020-03-09 15:17:30
第14章 DNS:域名系统 14.7 高速缓存 为了减少I n t e r n e t上D N S的通信量,所有的名字服务器均使用高速缓存。在标准的 U n i x实现中,高速缓存是由名字服务器而不是由名字解析器维护的。既然名字解析器作为每个应用的一部分,而应用又不可能总处于工作状态,因此将高速缓存放在只要系统(名字服务器)处于工作状态就能起作用的程序中显得很重要。这样任何一个使用名字服务器的应用均可获得高速缓存。在该站点使用这个名字服务器的任何其他主机也能共享服务器的高速缓存。 在迄今为止(图 1 4 - 9)所举例子的网络环境中,在 s u n主机上运行客户程序,通过主机n o a o . e d u的S L I P链路访问名字服务器。现在将改变这种设置,在 s u n主机上运行名字服务器。在这种情况下,如果使用 t c p d u m p监视在S L I P链路上的D N S通信量,将只能看到服务器因超出其高速缓存而不能处理的查询。 在默认情况下,名字解析器将在本地主机上( U D P端口号为5 3或T C P端口号为5 3)寻找名字服务器。从名字解析器文件中删除 n a m e s e r v e r行,而留下d o m a i n行: sun % cat /etc/resolv.conf domain tuc.noao.edu 在这个文件中缺少n a m e r s e

C语言函数3

前提是你 提交于 2020-03-09 06:52:02
函数递归 递归定义: 程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的主要思考方式在于: 把大事化小 递归的必要条件: 存在限制条件,当满足这个限制条件的时候,递归便不再继续。 每次递归调用之后越来越接近这个限制条件。 递归函数举例: 接受一个整型值(无符号),按照顺序打印它的每一位。 解析: 如输入1234,要使按顺序输出1 2 3 4 函数带入参数(1234) 由于1234不是单个数字,则进入向内层 递 的过程(给1234/10) 再次带入参数(123) 由于123不是单个数字,则进入向内层 递 的过程(给123/10) 再次带入参数(12) 由于12不是单个数字,则进入向内层 递 的过程(给12/10) 再次带入参数(1) 由于1是单个数字,则进行打印并向外层 归 的过程。 代码: # include <stdio.h> void print ( int n ) { if ( n > 9 ) { print ( n / 10 ) ; } printf ( "%d " , n % 10 ) ;

《算法图解》笔记

爷,独闯天下 提交于 2020-03-09 03:38:22
看书还得写笔记,文字的写不来,还是写电子的,自己的字跟狗爬一样,打出来的字好多了。 后续把自己看的基本关于网络的书也写点博客,一便于查寻,二便于加强记忆,要不然跟小说一样,看了就忘了。 第1章:算法介绍 理解大O表示法,并非以秒为单位。大O表示法让你能够比较操作数,它指出了算法运行时间的增速。 大O表示法说的是在查找情况中最糟的情形。 从快到慢晕倒的5种大O运行时间。 O(log n),也叫对数时间,这样的算法包括二分查找。 O(n), 也叫线性时间,这样的算法包括简单查找。 O(n * log n),这样的算法包括快速排序---一种比较快的排序算法 O(n2)【表示n的平方】, 这样的算法包括选择排序---一种速度较慢的排序算法 O(n!), 这样的算法包括旅行商的解决方案---一种非常慢的算法 第一章主要理解: 算法的速度指的并非时间,而是操作数的增速。 讨论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。 算法的运行时间用大O表示法表示。 O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快很多。 小结: 二分查找的速度比简单查找快很多。 O(logn)比O(n)快。需要搜索的元素越多,前者比后者就快得更多 算法运行时间并不以秒为单位。 算法运行时间是从其增速的角度度量的。 算法运行时间用大O表示法表示 最后上书中的二分查找代码 def

递归,贪心

我的未来我决定 提交于 2020-03-09 00:25:47
递归 递归算法是指程序直接或间接调用自身的技巧;他通常把一个大型复杂问题层层转化为一个与原问题相似的规模较小的问题来求解。其基本思想为层层分解,关键在于找出递归定义和终止条件。 例题 G:括号匹配问题 字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$“标注,不能匹配的右括号用”?"标注. Input 输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100 注意:cin.getline(str,100)最多只能输入99个字符! Output 对每组输出数据,输出两行,第一行包含原始输入字符,第二行由" " , " ? " 和 空 格 组 成 , " ","?"和空格组成," " , " ? " 和 空 格 组 成 , " “和”?"表示与之对应的左括号和右括号不能匹配。 SAMPLE INPUT ((ABCD(x) )(rttyy())sss)( SAMPLE OUTPUT ((ABCD(x) $$ )(rttyy())sss)( ? ?$ 为解决此问题引入STACK函数 # include <iostream> # include

二分查找递归和非递归方法分析

百般思念 提交于 2020-03-08 11:20:26
递归实现: 自己写的递归:多一个赋值操作,虽然可以得到正确的结果。但是比较难以理解。 问题:没有深刻理解递归返回值。return会在递归调用到最后,在递归结束的地方,会将返回值一层一层返回给方法,直到返回最后一层也就是方法不进行递归演算的动作时。 总结:首先要记住递归有递归头和递归体,递归头可能有多重情况。递归体也可能有多重情况。 public static int binarySearch(int[] arr,int n){ int low=0; int high=arr.length-1; return binarySearch2(arr,low,high,n); } public static int binarySearch2(int[] arr,int low,int high,int n){ int z=(low+high)/2; int i=-1; if(low<=high){ if(arr[z]==n ){ return i=z; }else{ if(arr[z]>n){ high=z-1; }else if(arr[z]<n){ low=z+1; } return binarySearch2(arr,low,high,n); } } return i; } 网友的递归: 没有找到对应值,递归结束会走对应的递归头 找到对应值,递归结束走对应递归头 public

递归

时光总嘲笑我的痴心妄想 提交于 2020-03-07 19:14:42
1.递归的概念 递归就是方法自己调用自己,每次调用时传入不同的变量 2.递归能解决什么样的问题 1.各种数学问题如:8皇后问题,汉诺塔,阶乘问题,迷宫问题,球和篮子的问题(google编程大赛); 2.各种算法中也会用到递归,比如快排,归并排序,分治算法等; 3.将用栈解决的问题->递归代码比较简洁 3.递归要遵守的重要规则 1.执行一个方法时,就创建一个新的受保护的独立空间(栈空间); 2.方法的局部变量是独立的,不会相互影响; 3.如果方法中使用的是引用类型变量(比如数组),就会引用该引用类型数据; 4.递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError; 5.当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用就将结果返回给谁,同时当方法执行完毕或者返回时,改方法也就执行完毕. 4.递归小案例 package com . itguigu . recursion ; public class RecursionTest { public static void main ( String [ ] args ) { test ( 4 ) ; int res = factorial ( 4 ) ; System . out . println ( "res=" + res ) ; } // 打印问题 public static

vivo一面凉经

爷,独闯天下 提交于 2020-03-06 18:30:41
链接: https://www.nowcoder.com/discuss/112192 目录 1.手撕代码,二分查找,递归非递归 2.java反射机制,优点缺点 3.java线程同步,synchronized锁升级机制,synchronized lock区别 4.项目,感觉最难的一点,怎么解决之类的 5.看成绩单,问我成绩为什么比较差 6.java public private protected default 7.手撕代码,中序遍历,递归非递归 8.学校的一堆事,什么社团经历,最有成就感的事,最失败的事,优点缺点啥的 1.手撕代码,二分查找,递归非递归 采用非递归方式完成二分算法 public static int binarySearch(Integer[] srcArray,int des){ int low=0; int high=srcArray.length-1; while(low<=high){ int middle=(low+high); if(des==srcArray[middle]) return middle; else if(des<srcArray[middle]){ high=middle-1; }else{ low=middle+1; } } return -1; } 采用递归方式完成二分查找算法 int BinSearch(int Array[