精华内容
下载资源
问答
  • Java中递归快还是循环快? 还是有什么适用情况? 例如求100万的阶乘
  • 1.算法抽象上所谓的循环(更准确点说,叫做迭代——顺便,C艹有的是“迭代语句”而不是“循环语句”)是递归的特例。写成循环的东西能直接转写成递归形式,反过来就得自己造活动记录了(例如栈)。2.递归调用需要...

    1.算法抽象上所谓的循环(更准确点说,叫做迭代——顺便,C艹有的是“迭代语句”而不是“循环语句”)是递归的特例。写成循环的东西能直接转写成递归形式,反过来就得自己造活动记录了(例如栈)。
    2.递归调用需要维护活动记录,而迭代直接复用了存储,可以省略这些开销,所以体系结构若执行显式递归调用一般更慢。但这里一般也不会慢多少,主要还是存储空间有压力(调用栈溢出)。
    3.但递归是递归,因为as-if rule,实现可以优化掉(最显著的,对符合尾递归形式的代码进行尾调用优化(TCO))不见得就会生成递归调用的代码,所以未必更慢。只不过C艹不像Scheme这样的语言强制要求TCO并且可以关掉优化所以比较容易体现。

     

    顺便,不懂as-if rule的请猛戳这里:http://stackoverflow.com/questions/15718262/what-exactly-is-the-as-if-rule

     

    转载于:https://www.cnblogs.com/foohack/p/3918826.html

    展开全文
  • 递归循环数组

    2020-09-04 14:46:03
    递归好久不用都忘了,还是记录一下吧 function cycle(arr) { arr.forEach((item) => { item.age = 20 if(item.children.length !== 0) { cycle(item.children) )} cycle(arr1)

    递归好久不用都快忘了,还是记录一下吧

    function cycle(arr) {
      arr.forEach((item) => {
       item.age = 20
       if(item.children.length !== 0) {
       cycle(item.children)
    )}
    cycle(arr1)
    
    展开全文
  • 快速幂 递归实现

    2020-02-04 14:37:51
    快速幂 递归实现 计算一个double的整数次方,有很多种方法 可以使用一个循环,乘n次,时间复杂度为O(n) 快速幂可以实现复杂度为O(log2n) 求取浮点数x的n(整数)次方,可以转换为求取x的n/2(整除)次方,因为不论n...

    快速幂 递归实现

    计算一个double的整数次方,有很多种方法
    可以使用一个循环,乘n次,时间复杂度为O(n)
    快速幂可以实现复杂度为O(log2n)

    求取浮点数xn(整数)次方,可以转换为求取xn/2(整除)次方,因为不论n是奇数还是偶数,都有

    xn = xn/2 * xn/2 (n为偶数)

    xn = xn/2 * xn/2 * x (n为奇数)

    例:求取28
    一般朴素算法是:

    28 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2

    快速幂是:

    28 = 24 * 24

    24 = 22 * 22

    22 = 21 * 21

    21 = 20 * 2 (递归终止条件:n==0)

    可以看到时间复杂度控制在O(log2n),因为把n逐步拆解为n/2,每次除2当然是O(log2n)了

    代码

    #include <iostream>
    
    using namespace std;
    
    double fastPow(double x, int n)
    {
    	if(n == 0)
    	{
    		return 1;
    	}
    	double half = fastPow(x, n/2);
    	if(n%2 == 0)
    	{
    		return half * half;
    	}
    	else
    	{
    		return half * half * x;
    	}
    }
    
    int main()
    {
    	double x;
    	int n;
    	cin>>x>>n;
    	cout<<fastPow(x, n)<<endl;
    	
    	return 0;
    }
    
    展开全文
  • 在生活中,假如你们在玩一个扑克,你的同伴随便拿了一张牌让你来猜大小,同时他会告诉你你的猜测是偏大还是偏小,那你应该怎么猜可以最的猜出答案呢?答案就是二分查找:每次都猜中间的数,将猜测的范围减半。 2....

    1.概念:建立在有序集合上分段的进行查找。在生活中,假如你们在玩一个扑克,你的同伴随便拿了一张牌让你来猜大小,同时他会告诉你你的猜测是偏大还是偏小,那你应该怎么猜可以最快的猜出答案呢?答案就是二分查找:每次都猜中间的数,将猜测的范围减半。

    2.实现:首先看二分查找的递归形式,因为它易于理解

    	//尾递归形式,num为待查数
    	public static int rank1(int num, int lo, int hi){
    		if(hi < lo) return lo;
    		int mid = lo + (hi - lo) / 2;		//注意这个的mid求法没有写成mid = (lo + hi) / 2 的形式可以加快运行速度(大数的除法会耗时久),并且放置溢出(lo + hi)
    		int cmp = num - a[mid];
    		
    		if(cmp < 0){
    			return rank1(num, lo, mid - 1);
    		}else if(cmp > 0){
    			return rank1(num, mid + 1, hi);
    		}else{
    			return mid;
    		}
    	}

    这里很自然的采用了尾递归的形式:每次迭代的最后进入下一次迭代。递归的调用自己,直到找到或找不到最终的值。

    尾递归的优势很明显:它易于理解,符合我们通常的思维习惯。

    尾递归的劣势也很明显:在每次递归的调用下一次递归时,函数会保存上一次的上下文(传入参数,中间结果等),再将新调用的函数进行压栈。可是这里就存在了浪费,因为尾递归在原函数递归调用下一个函数以后会什么都不做(意味着之前保存的上下文没有作用)傻傻的等着递归调用的函数执行完成才能返回。

    好在现代的编译器都很聪明:它们一般都可以自动的把尾递归转化为循环的形式,从而节约了宝贵的资源(保存执行方法的方法栈)。

    好了,下面我们看下转化后的循环形式的二分查找是什么样子:

    	//循环形式,num为待查数
    	public static int rank2(int num, int lo, int hi){
    		while(hi >= lo){
    			int mid = lo + (hi - lo) / 2;
    			int cmp = num - a[mid];
    			if(cmp < 0){
    				hi = mid - 1;
    			}else if(cmp > 0){
    				lo = mid + 1;
    			}else{
    				return mid;
    			}
    	}
    		return lo;
    	}

    这种形式看起来就没有那么直观了,不过他们的思想都是一样的:不断的调用自己直到找到或找不到最终的值。循环让二分查找消去了函数的调用,而是直接在函数内部不断的改变参数。这样做的好处就是节省了空间。这里所有的变量空间都只分配了一次(它们的值在不断的变化)。所以相对于递归形式来说,消耗的空间约为其1/N(N为循环或迭代次数)。
    3.算法分析

    大家都知道二分查找的时间复杂度是lgn。可是这lgn是怎么来的呢?我们就以循环的实现方式来分析其时间复杂度。

    分析时间复杂度时要找到执行频率最高的语句,在这里就是 :

    			int mid = lo + (hi - lo) / 2;
    			int cmp = num - a[mid];
    			if(cmp < 0){            //if结构算一句,因为它一次只会执行其中一个分支
    				hi = mid - 1;
    			}else if(cmp > 0){
    				lo = mid + 1;
    			}else{
    				return mid;
    			}

    那么当最坏的情况下,当要查找一个长度为N的数组时,这几句代码要执行多少次呢?设执行次数为x,有N * (1/2)^x = 1 ,由此可以解出x = lgn(在算法分析中lgn都是以2为底的)。所以二分查找的时间复杂度为lgn。

    在这放上一条结论:在N个键的有序数组中进行查找最多要进行lgn + 1 次比较。这里的+1是对应于查找不到元素的情况。有兴趣的话可以通过我后面给出的代码进行测试。

    4.测试代码

    public class BinarySearchTest {
    	public static int[] a = {
    			0,1,2,3,4,4,6,7,8,9
    	};
    	public static int[] b = {
    			0,1,2,3,4,5,6,7,8,9
    	};
    	
    	
    	public static void main(String[] args) {
    		System.out.println(rank1(5, 0 ,9, 0));
    		System.out.println(rank2(5, 0 ,9, 0));
    	}
    	
    	//尾递归形式,num为待查数
    	public static int rank1(int num, int lo, int hi, int timeofCompare){
    		if(hi < lo) return timeofCompare; //return lo;
    		int mid = lo + (hi - lo) / 2;
    		int cmp = num - a[mid];
    		timeofCompare ++;
    		if(cmp < 0){
    			return rank1(num, lo, mid - 1, timeofCompare);
    		}else if(cmp > 0){
    			return rank1(num, mid + 1, hi, timeofCompare);
    		}else{
    			return timeofCompare; //return mid;
    		}
    	}
    	//循环形式,num为待查数
    	public static int rank2(int num, int lo, int hi, int timeofCompare){
    		while(hi >= lo){
    			timeofCompare++;
    			int mid = lo + (hi - lo) / 2;
    			int cmp = num - b[mid];
    			if(cmp < 0){
    				hi = mid - 1;
    			}else if(cmp > 0){
    				lo = mid + 1;
    			}else{
    				return timeofCompare; //return mid
    			}
    	}
    		return timeofCompare;		//return lo
    	}
    
    }




    展开全文
  • 秋招季节又来临了,不管是笔试还是面试白板编程,二叉树前中后序遍历是非常常见的热身题,递归写法想必同学们都是信手拈来。但是面试官看你写得这么熟,小伙骨骼精奇,是块扣腚的好材料,必须好好考察,下面问题就...
  • Python 递归

    2020-09-15 10:38:30
    递归剖析 递归真的很重要,之前学的时候,学的一知半解,以为...直到接触算法后,在解决问题时,最,最容易理解的解法就是递归,但是此时的递归却是看不太懂为什么要这样做!我先来说下,在算法中遇到可以用递
  • POJ2718 递归递归

    2016-07-03 19:21:00
    我之前的想法是一个递归,然后两个for循环枚举L1和L2,结果TLE了,然后想了一下剪枝发现没办法剪,然后看了一下别人的代码,用了next_permutation函数,虽然表示在书上看到过,但是具体确实没有用过,看到别人用了,...
  • 参考链接: Python | print()中的结束参数 ...疑问太多了,还有就是被告知一句:递归能解决的问题,循环都能解决,所以就更加不重视递归了!直到接触算法后,在解决问题时,最,最容易理解的解法就是递归,但是...
  • 偶尔看到一篇博客,http://blog.csdn.net/feixiaoxing/article/details/6838362,一步一步写算法,觉得挺不错,坚持不是一件容易的事,当偶尔有空时候看看算法觉得时间还是过的挺的,算是打算时间吧,同时也锻炼...
  • 这道题与昨天的题目是同一个思路,能这么ac还是因为昨天的基础,昨天博客leetcode 79单词搜索与小道面积 leetcode695 岛屿的最大面积 总结 step 1 for循环遍历整个岛屿坐标 step 2 对于每个坐标进行判断若为1则...
  • 快速幂

    2018-03-28 10:06:50
    快速幂有循环取模和递归取模,以下是自己总结的,如果有错还请留言.循环取模第一种:ll pw(ll x,ll y) { ll result = 1; while(y &gt; 0) { if(y % 2 == 1) //判断奇数还是偶数 { result = result * x ...
  • 最终还是上网看了别人的代码 有的真简洁!真的是开了眼界了 由衷的佩服 看了其他的代码 思路都是利用 抽屉原理 但是“菜小白”的实现起来真的棒 能看出来 C语言 玩的真转··· 做的晕了···打算明天做
  • Vue3.0是如何变的?

    2021-01-13 11:03:22
    什么是diff算法:传统的Diff算法通过循环递归对节点进行比较,然后判断每个节点的状态以及要做的操作,最后根据vnode进行DOM的渲染。会有两颗DOM树,一个是上次渲染生成的DOM树,一个数数据更新后生成的DOM树,Vue2中会...
  • 就生成个菜单树,居然还用到递归,时间复杂度阶数级上升,这还是以前培训的时候老师演示的“无限级分类”,有更厉害的同学直接在循环里面查询数据库了,数量少的时候真没什么区别。这几年一直这么用,直到稍微了解...
  • springboot+mybatis+db2+vue

    2018-12-01 07:17:58
    我看了看写的代码 用了javafor循环递归查询子机构 我改成数据库递归有就了10几秒 在改成异步还是慢 我想了想 能不能先查询父机构 再点击父机构再去根据父机构查询子机构 思路倒是出来了 前端vue不知道...
  • 感觉递归还是自己的难点,需要专项练习。 class Solution { public: double Mul(double x, long long n) { if(n==0) return 1.0; double y = Mul(x,n/2); return n % 2 == 0 ? y * y : y * y * x; .
  • 计算机擅长进行加法乘法运算 ...自动化,本质还是循环 计算思维的思路是科学化和工程化 工程化其实就是求近似 比如上面的正弦函数展开式 中小学都是理想化的, 大学学的就是求近似,无限接近,求极
  • 快速排序—C++实现

    2021-04-03 18:46:28
    排的思想是:选定一个基准为,采用双指针的方法,左指针找比基准位小的数,右指针找比基准位大的数,进行交换,最后的结果就是,基准位左边的都是比它小的数,基准位右边都是比它大的数,再分别对这两个区间进行...
  • 欧拉计划总结(5)

    2012-05-23 14:15:56
    Hello,各位好啊,最近这几天考试了,所以大部分时间都在为考试而奋斗(归咎到底还是因为平时没认真听课啊,5555 o(>﹏ problem 41:求最大的n位pandigital质数。对这道题目,我先想到的是用递归。设计一个...
  • 从step=1开始,以循环消除递归,大幅度减少用时(~_~,虽然还是递归的快速要普遍慢……) //归并排序 //合并数组 借助存储空间,进行归并并覆写回原数组 //数组分别是arr[i...j-1](其中 j-1 = i+step-1) arr[j......
  • Sql 关键字with

    2013-09-04 18:11:00
    我在写一篇时候,被很多同学说没技术含量,实际在开发过程中,我们做递归实际是在数据库端处理,把当前子集所有的都给递归出来。再 程序里再循环匹配的 这样性能就会多了。 这里涉及到一个sqlserver的一个关键字...
  • 斐波那契额数列_递推法 斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34……起始的两项是1、1,之后的每一都等于前面两项。 下面用一个简单的题来...递推的主要还是for循环的应用,首先需要确定一...
  • 最全前端开发面试题目:...自己多写几次,有递归形式的再好好看一下使用循环形式达到结果的形式,基本也就没什么问题了。 2、二分搜索等。 3、二叉树遍历相关。 例如前序遍历中序遍历后序遍历等,深度优先搜索...
  • 知乎5题测试

    2017-10-09 16:54:35
    作者说:如果上面的题目不会写出代码,说明只学了一些语法皮毛!...第四题强调用递归实现,我比较笨,只会用for循环。大神们来看看有没有更好的解决办法。 1、只用循环输出这样的样式:1,2,3,4,5,6,7,8,9,
  • 1、算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 ... 在得到结果之前,你猜猜那种方式计算结果更一些,还是一样?  测...
  • 数据结构与算法.xmind

    2020-06-19 17:04:23
    底层干的还是插入排序干的活 做法 最外层for外循环控制增量的数量,每次/2 第二层for循环控制每次增量那组开始进行插入排序,直至完毕 第三层while循环找到要插入到哪个位置 归并...
  • 在这里,我们重新捋一遍排的思想:其实它的思想也还是分治法,(1)找到一个基准点(可以是起始点,也可以是任何一个位置),比它大的放在右边,比它小的放在左边,这样一个循环下来,这个基准点的位置就确定下来...

空空如也

空空如也

1 2 3 4 5
收藏数 88
精华内容 35
关键字:

递归快还是循环快