斐波那契数列的表达式: F(1)=1 F(2)=1 F(n)=F(n-1)+F(n-2) (n>2) 递归算法:时间复杂度O(2^n) int recursive_method(int...) return 1; else return recursive_method(n - 1) + recursive_method(n - 2); } 非递归算法
递归版 1 /* 2 本程序说明: 3 4 递归方法参见《大话数据结构》 5 6 */ 7 #include 8 #include 9 using...} 66 /*************************************************************/ 67 /*************************尾递归方法...(array); 95 return 0; 96 } 参考链接:http://www.cnblogs.com/cj723/archive/2011/04/27/2029993.html 非递归版...1 /* 2 本程序说明: 3 4 非递归方法利用了栈 5 6 */ 7 #include 8 #include 9 #include <...high); 77 temp.push(pivot_index+1); 78 } 79 } 80 } 81 } 82 //非递归排序入口函数
前言: 本文将通过图解与代码相结合的方式,详细介绍快速排序的非递归实现方法。虽然前文已展示递归实现方案,但在实际面试中,面试官更倾向于考察非递归版本的实现。...这种实现方式不仅能加深对算法的理解,还能展现应聘者对栈结构的掌握程度。...一、非递归实现快排的思路 1.1核心原理:手动模拟栈 在标准的递归快速排序中,当我们写下 quickSort(a,left, right) 时,系统会自动分配一块内存(函数调用栈)来记住当前的...在非递归版本中,我们不需要系统帮忙,而是自己创建一个栈(Stack)数据结构。...如果数组极其巨大,或者处于最坏情况(比如倒序数组排成正序),递归层数太深会导致程序崩溃。 非递归使用堆内存(Heap)来存栈,空间通常比系统栈大得多,更安全。
递归由于效率低的问题,经常要求转换成循环结构的非递归形式。 三:递归转尾递归 有些简单的递归问题,可以不借助堆栈结构而改成循环的非递归问题。... 不可否认,递归便于算法的理解,代码精炼,容易阅读,但递归的效率往往是我们最在意的问题。...一般来说,递归转化为非递归有两种情况: 第一种情况:正如第三节所说的递归转尾递归的问题,这类问题可以不借助堆栈结构将递归转化为循环结构。...第二种情况:借助堆栈将递归转化为非递归(PS:任何递归都可以借助堆栈转化成非递归,第一种情况严格意义上来说不能看做是一种情况)。...第二种方法:借助堆栈的循环结构算法。这种方法常常适用于某些局部变量有依赖关系,且需要重复执行的场景,例如二叉树的遍历算法,就采用的这种方法。 最后,通过一个用堆栈模拟快排的例子来结束本文。
前言: 非递归实现归并排序,通常被称为 “自底向上”(Bottom-Up) 的归并排序,与递归版本(先将数组对半拆分直到只剩一个元素,再通过递归栈回溯合并)不同,非递归版本直接从最小的子数组...一、归并排序非递归的核心思路 递归算法转换为非递归实现主要有两种常见方法: 1.使用栈结构模拟递归过程 2.将递归逻辑改写为循环结构 1.1 栈模拟失效 如果仅通过栈结构模拟递归过程,我们只能够做到拆分数组...3.3递归与非递归的区别 你可能会疑惑:“为什么递归版本的归并排序,好像没有这么多复杂的边界判断?...3.3.2非递归:刻舟求剑,需手动补漏 核心思路:不进行 “拆分”,而是从最小步长(长度 1)开始,按固定规则 “合并”,严格遵循 1→2→4→8→… 的翻倍逻辑,用固定尺寸的 “框” 去框选相邻子数组进行合并...关键特点:规则固定,必须处理边界溢出 非递归的合并规则是 “僵硬” 的,固定尺寸的 “框”(gap)不会因数组长度调整: 比如数组长度 N=6,当 gap=4 时,按规则会尝试框选
本博客前面文章已对图有过简单的介绍,本文主要是重点介绍有关图的一些具体操作与应用 阅读本文前,可以先参考本博客 各种基本算法实现小结(四)—— 图及其遍历 和 图的一些基本算法 无向图...——邻接矩阵的深度优先和广度优先算法实现 测试环境:VS2008(C) #include "stdafx.h" #include #include #
因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。...在三种遍历中, 前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 ...//非递归前序遍历 void pre_order(BTree *root) { stack s; BTree *p = root; while... printf("%2c",root->data); in_order(root->rchild); } } 2.非递归实现... 后序遍历的非递归实现是三种遍历方式中最难的一种。
归并排序 递归 1.基本思想 主要使用了 分治思想 即 大事化小 ,先使每个子序列有序,子使序列段有序,将两个有序表合并成一个有序表 2....使用两个函数完成归并 因为想要malloc只开辟一块空间,而不是设置在mergesort1函数中每递归一次开辟一块空间,极大节省开辟空间开销 3....递归结束条件 当下标 left 与right 相等时,正好为一个数,即 return 返回 当数组为0,就会发生 left>right,区间不存在 4.时间复杂度与空间复杂度计算 1....归并排序 非递归 1....代码 void mergesortNonR(int* a, int n)//归并排序 非递归 { int* tmp = (int*)malloc(sizeof(int) * n); if
一般斐波纳契数列采用递归或是数组缓存的方式,这里的方法不考虑重复计算斐波纳契数列的情况。...fibonacci 数列定义,查看百度百科的解释>> n = 1,2 时,fib(n) = 1 n > 2 时,fib(n) = fib(n-2) + fib(n-1) 1、递归 function... return a + b; } 对比: 如果只使用一次运算,第三种方法速度最快; 如果多次使用,第二种方法明显优于其它两种; 在n较大的情况下不推荐使用第一种;n为10*10000的时候递归就已经报内存溢出了
最坏情况是每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果是基准左边的子区间为空(或右边的子区间为空),而划分所得的另一个非空的子区间中记录数目,仅仅比划分前的无序区中记录个数减少一个...总的关键字比较次数:O(nlgn) 尽管快速排序的最坏时间为O(n*n),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快者,快速排序亦因此而得名。...快排空间复杂度:在通常情况下为O(log2n),需要使用深O(log2n)的栈实现递归,如果是最坏情况的话,很显然就要O(n)的空间了。...*********************************** 应用场景: 快排算法一般应用在排序中,但是分治法的思想应用广泛,比如在《剑指Offer》中, 题40:最小的k个数和题39:数组中出现次数超过一半的数字均用到了分治法的思想
1.递归方法实现 #include #include int Strlen(char str[]){ if(str[0]=='\0'){ return 0;}...char str[] = "hehe"; int len = Strlen(str); printf("%d\n",len); system("pause"); return 0; } 2.非递归方法实现
先序非递归遍历二叉树,中序非递归遍历二叉树,后序非递归遍历二叉树及双栈法。...先序非递归遍历二叉树 先序非递归遍历比较简单,感觉与DFS类似,根据先序遍历的规则根左右,先将根节点压入栈,然后遍历左子树,再遍历左子树的左子树,一头走到NULL,把每次遍历的左子树的根节点依次入栈并把当前结点数据打印出来...= Creat(a+1,b,i); T->rchild = Creat(a+i+1,b+i+1,n-i-1); return T; } } return NULL; } //先序非递归遍历...Creat(a+1,b,i); T->rchild = Creat(a+i+1,b+i+1,n-i-1); return T; } } return NULL; } //中序遍历非递归...单栈法 后序非递归遍历和先序中序非递归开始类似,先将左子树的左孩子的的左孩子的….每个节点压入栈。
问题描述: 图的度序列是指图中所有顶点的度(与顶点关联的边的条数,允许图有自环边,也就是以同一个顶点作为出发点和终点的边)按非递增顺序排列得到的序列。...如果一个包含若干非负整数的非递增序列可以作为某个图的度序列,则称这个序列可图化,为可图化序列。容易得知,包含负数的序列一定是不可图化的,全0序列是可图化的。...已知,非递增序列[a[0], a[1], a[2], ..., a[n]]是否为可图化序列,等价于序列[a[1]-1, a[2]-1, a[3]-1, ...a[a[0]]-1, a[a[0]+1],...a[a[0]+2], ..., a[n]]中的整数非递增排列后得到的序列是否为可图化序列。...下面的函数func1()和func2()分别使用非递归算法和递归算法判断一个序列是否可图化,函数接收一个包含若干非负整数且按非递增顺序排列的元组seq作为参数,要求判断seq是否为可图化序列,是则返回True
「@Author:Runsen」 刷Leetcode,需要知道一定的算法模板,本次先总结下二叉树的递归和非递归的遍历算法模板。 二叉树的四种遍历方式,前中后加上层序遍历。...对于二叉树的前中后层序遍历,每种遍历都可以递归和循环两种实现方法,且每种遍历的递归实现都比循环实现要简洁。...递归 下面伪代码是二叉树遍历的递归算法模板,顺序是中左右,也就是前序遍历,改变中左右三行代码的顺序,前中后序三种递归遍历轻松解决。...help(root.left) # 左 help(root.right) # 右 help(root) return res 对此也提供C++代码,递归算法模板一定要加上终止条件...关于树的不同深度优先遍历(前序,中序和后序遍历)就是递归和非递归的写法。广度优先遍历在树中,就是层次遍历。 在二叉树的层级遍历中,我们需要用到队列这个数据结构,帮助我们完成遍历。
实现功能:同最大流 1 这里面主要是把前面的邻接矩阵改成了邻接表,相比之下速度大大提高——本人实测,当M=1000000 N=10000 时,暂且不考虑邻接矩阵...
1.3 递归 函数内部自己调用自己 递归有两个元素,一个是递归点(从什么地方递归),第二递归出口 例题1:输出9 8 7 6 … php function printer($num) { echo $num,' '; if($num==1) //递归出口 return; printer($num-1); //递归点...=5 */ //打印前10个斐波那契数 for($i=1;$i<=10;$i++) echo fbnq($i),' '; //1 1 2 3 5 8 13 21 34 55 小结:递归尽量少用...,因为递归需要用到现场保护,现场保护是需要消耗资源的
树使用递归遍历非常方便,如果将代码拉伸开来,我们能否是否非递归代码来实现呢?当然是可以的,我们只要把递归的循环步骤修改为while就可以了。
最后还是一句话提醒了我 递归=循环+栈 将递归的调用栈保存到栈中,保存的是数组的元素的下标:low 和 high,且相互对应,既可以头(low)尾(high)呼应,也可以一次弹出两个分别是low和high...partition分区部分跟普通快排一样 详情可以见我的递归快排版.https://www.jianshu.com/p/f4c8f2aeb607 这里讲一下,如何让递归部分改成非递归: 总体来说用到的思路我上面引用的话一样...array[a]=array[b]; array[b]=temp; } 我的方法跟其他人的不太相同,但是总体来说是一种思路.大家的脑回路不一样最适合你的实现可能不太一致,这里参考了实现非递归快排的许多方法
[left, div) QuickSort(array, left, div); // 递归排[div+1, right) QuickSort(array, div+1, right); }...上述为快速排序递归实现的主框架,会发现与二叉树前序遍历规则非常像,先取中间,递归左区间,再递归右区间。...4.3小区间优化 因为在递归到后期时,有的小序列已经接近有序,使用直接插入排序效率就会很高。...QuickSort(a, keyi+1, right); } else//区间长度小于10时 { InsertSort(a + left, right - left + 1); } } 五、快速排序的非递归实现...快排使用到了递归的思想和方法,但是递归如果递归太深的话就会有爆栈的风险,所以在这里也介绍一下快速排序的非递归实现方法。