递归调用

基础算法——递归与递推

ぃ、小莉子 提交于 2019-12-16 23:01:47
程序调用自身的编程技巧称为 递归 ( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。 一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 递推 算法是一种用若干步可重复的简运算(规律)来描述复杂问题的方法。递推是序列计算机中的一种常用算法。它是按照一定的规律来计算序列中的每个项,通常是通过计算出前面的一些项来得出序列中的指定项的值。其思想是把一个复杂的庞大的计算过程转化为简单过程的多次重复,该算法利用了计算机速度快和不知疲倦的机器特点。 1. 小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一半,又多吃一个.以后每天早上吃前一天剩下的一半另一个.到第10天早上猴子想再吃时发现,只剩下一个桃子了.问第一天猴子共摘多少个桃子? = =这其实就是一个递归算法题 2. 有雌雄一对兔子,假定过两个月便可繁殖雌雄各一的一对小兔子。问过n个月后共有多少对兔子? = =这是著名的斐波那契数列,递推必刷题之一

对递归算法的理解

北战南征 提交于 2019-12-16 20:19:26
递归算法 ① 程序调用自身的编程技巧称为递归。 ② 一个方法在其定义或说明中又直接或间接的调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需的多次重复计算,大大地减少了程序的代码量。 递归算法注意 ① 递归就是在方法里调用自身。 ② 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 示例:使用递归算法求5!(阶乘) 分析:5!=5*4!,4!=4*3!,3!=3*2!,2!=2*1!,1!=1 再将最后的值从后往前返回到它的上一个,返回1!,2!,3!,4! 最后是5!。 1 class FacUtil{ 2 public static int getFac(int number){ 3 if(number==1){ 4 return 1; 5 }else{ 6 return number*getFac(number-1); 7 } 8 } 9 } 主方法调用 1 System.out.println(FacUtil.getFac(5)); 对递归算法的理解   1.递归的定义:程序调用自身的编程技巧称为递归。递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法

递归

不问归期 提交于 2019-12-16 17:35:49
一、什么是递归? 1.递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归。 2.方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。 3.基本上,所有的递归问题都可以用递推公式来表示,比如 f(n) = f(n-1) + 1; f(n) = f(n-1) + f(n-2); f(n)=n*f(n-1); 二、为什么使用递归?递归的优缺点? 1.优点:代码的表达力很强,写起来简洁。 2.缺点:空间复杂度高、有堆栈溢出风险、存在重复计算、过多的函数调用会耗时较多等问题。 三、什么样的问题可以用递归解决呢? 一个问题只要同时满足以下3个条件,就可以用递归来解决: 1.问题的解可以分解为几个子问题的解。何为子问题?就是数据规模更小的问题。 2.问题与子问题,除了数据规模不同,求解思路完全一样 3.存在递归终止条件 四、如何实现递归? 1.递归代码编写 写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。 2.递归代码理解 对于递归代码,若试图想清楚整个递和归的过程,实际上是进入了一个思维误区。 那该如何理解递归代码呢?如果一个问题A可以分解为若干个子问题B、C、D,你可以假设子问题B、C、D已经解决。而且

迭代,循环,遍历,递归的区别

你。 提交于 2019-12-16 00:18:24
循环(loop),指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。                            [ 循环则技能对应集合,列表,数组等,也能对执行代码进行操作。]                       迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。                            [迭代只能对应集合,列表,数组等。不能对执行代码进行迭代。]                 遍历(traversal),指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次。                             [遍历同迭代一样,也不能对执行代码进行遍历。] 递归(recursion),指的是一个函数不断调用自身的行为。比如,以编程方式输出著名的斐波纳契数列。                            [线性递归和尾递归。] 来源: 51CTO 作者: 喝醉的熊 链接: https://blog.51cto.com/13550695/2458719

Java实现八大排序算法

痞子三分冷 提交于 2019-12-15 14:34:07
我对java的八大排序算法进行了总结,以此文展示Java八大算法 常见排序算法如下: 1.直接插入排序 2.希尔排序 3.简单选择排序 4.堆排序 5.冒泡排序 6.快速排序 7.归并排序 8.基数排序 排序方法示例简介 直接插入排序 基本思想 通常人们整理桥牌的方法是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置。在计算机的实现中,为了要给插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位。 算法描述 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 将新元素插入到该位置后 重复步骤2~5 注意: 如果 比较操作 的代价比 交换操作 大的话,可以采用二分查找法来减少 比较操作 的数目。该算法可以认为是 插入排序 的一个变种,称为二分查找插入排序。 代码实现 /** * 通过交换进行插入排序,借鉴冒泡排序 * * @param a */ public static void sort ( int [ ] a ) { for ( int i = 0 ; i < a . length - 1 ; i ++ ) { for (

java学习(File&递归&字节流)

99封情书 提交于 2019-12-12 17:04:10
1.File类 1.1File类概述和构造方法【应用】 File类介绍 它是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对象的 对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的 File类的构造方法 方法名 说明 File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例 File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例 File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例 示例代码 public class FileDemo01 { public static void main ( String [ ] args ) { //File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 File f1 = new File ( "E:\\itcast\\java.txt" ) ; System . out . println ( f1 ) ; //File(String parent, String child)

递归算法详细讲解

岁酱吖の 提交于 2019-12-12 13:39:58
原作者:书呆子Rico 《递归的内涵与经典应用》 http://my.csdn.net/justloveyou_ 摘要:   大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归。毋庸置疑地,递归确实是一个奇妙的思维方式。对一些简单的递归问题,我们总是惊叹于递归描述问题的能力和编写代码的简洁,但要想真正领悟递归的精髓、灵活地运用递归思想来解决问题却并不是一件容易的事情。本文剖析了递归的思想内涵,分析了递归与循环的联系与区别,给出了递归的应用场景和一些典型应用,并利用递归和非递归的方式解决了包括阶乘、斐波那契数列、汉诺塔、杨辉三角的存取、字符串回文判断、字符串全排列、二分查找、树的深度求解在内的八个经典问题。 一. 引子    大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归。毋庸置疑地,递归确实是一个奇妙的思维方式。对一些简单的递归问题,我们总是惊叹于递归描述问题的能力和编写代码的简洁,但要想真正领悟递归的精髓、灵活地运用递归思想来解决问题却并不是一件容易的事情。在正式介绍递归之前,我们首先引用知乎用户李继刚( https://www.zhihu.com

二叉树非递归遍历

血红的双手。 提交于 2019-12-11 19:30:18
上码: 1 #include <iostream> 2 #include <string> 3 #include <stack> 4 #include <queue> 5 using namespace std; 6 7 template<class T> 8 struct BiNode { 9 T data; 10 BiNode<T> *lchild, *rchild;//左子树、右子树 11 }; 12 13 template<class T> 14 class BiTree 15 { 16 public: 17 BiTree(); //构造函数,初始化二叉树,前序序列由键盘输入 18 ~BiTree(); //析构函数,释放二叉链表中的各结点的存储空间 19 BiNode<T>* Getroot(); //获得指向根节点的指针 20 void PreOrder(BiNode<T>* root); //前序遍历二叉树 21 void InOrder(BiNode<T>* root); //中序遍历二叉树 22 void PostOrder(BiNode<T>* root); //后序遍历二叉树 23 void LeverOrder(BiNode<T>* root); //层序遍历二叉树 24 25 void NonPreOrder(BiNode<T>* root); 26

算法学习之分治、迭代、递归

五迷三道 提交于 2019-12-11 17:57:26
分治策略:将一个大的问题,分解为相对独立的小问题,通过解决这些小问题得到的答案来拼凑出最后的解。 迭代:从小规模的问题,逐步累积出较大问题的解,最终获得所需要解决问题的解 递归:通过不断调用自身,但是相对的每次调用自己时候,所解决的问题规模较小,比较符合分治的思想。 来源: CSDN 作者: qq_24605545 链接: https://blog.csdn.net/qq_24605545/article/details/103484742

排序算法系列——快速排序

旧街凉风 提交于 2019-12-11 14:00:51
什么是快速排序? 快速排序 ,顾名思义它排序的速度十分的快。 它快到什么程度呢? C语言标准库中的 qsort 函数就是使用快速排序实现的! 说到快速排序,离不开两个重要的概念: 递归 和 分治算法(Divide ans conquer, D&C) 。 如果要讲清楚这两个概念,可以单独写两篇文章出来了。 因此这里不做深入,只简单介绍一下: 递归 :重复调用自己的函数。一般由两个部分组成 基线条件 和 递归条件 ,程序在符合 基线条件 的时候返回,在符合 递归条件 的时候调用自己。 分治算法(Divide ans conquer, D&C) : 将大的问题化解为相同类型的小问题。一种著名的递归式问题解决办法,一般分为两个步骤,首先找出尽可能简单的 基线条件 ,然后将 递归 的将问题分解为小问题,直到小问题符合 基线条件 。 假如还不太明白这两个概念,没关系,看下面的例子就可以了。 排序过程 既然 快速排序 的核心思想是 D&C ,那么它的 基线条件 和 递归 条件分别是什么呢? 首先我们思考一下, 什么样的数组需要排序 ? 长度为 0 的数组需要排序吗? 不需要。因为它的没有顺序的概念。 长度为 1 的数组需要排序吗? 不需要。因为可以把它看做一个有序数组了。 长度为 2 的数组需要排序吗? 需要。因为并不能确定它的顺序。 因此,我们可以把 长度为0或1的数组 设为是 基线条件 。