递归

C++算法程序整理——递归算法

♀尐吖头ヾ 提交于 2020-02-10 20:47:31
递归算法 递归,定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。 一般来说,能够用递归解决的问题应该满足以下三个条件: 需要解决的问题可以转化为一个或多个同构(或同样性质的)子问题来求解,而这些子问题的求解方法与原问题完全相同,只是在数量规模上不同。 递归调用的次数必须是有限的。 必须有结束递归的条件来终止递归。 什么情况下使用递归: 定义是递归的,如n!,Fibonacci数列等,求解这类问题可将其递归定义直接转换成对应的递归算法。 数据结构(如树,单链表等)是递归的。结构体中的指针指向了自身的类型,是一种递归的数据结构。对于这类递归结构,采用递归的方法编写算法既方便,又高效。 问题的求解方法是递归的, 如 Hanoi 问题的求解。 递归模型,递归模型是递归算法的抽象,它反映了一个递归问题的递归结构。以求解n!为例,其递归模型如下: fun(1) = 1 (1) fun(n) = n*fun(n-1) n > 1 (2) 递归模型一般由 递归出口 和 递归体 组成。 递归出口 给出了递归的终止条件, 递归体 给出了 fun(n) 的值与 fun(n-1) 的值之间的联系。 递归算法的执行过程, 一个正确的递归程序虽然每次调用的是相同的子程序,但它的参量、输入数据等均有变化。 在正常的情况下,随着调用的不断深入,必定会出现调用到某一层的函数时

22 递归

孤街醉人 提交于 2020-02-10 20:00:46
非阶乘 阶乘 迭代实现: 递归方法: 来源: CSDN 作者: NANCYGOODENOUGH 链接: https://blog.csdn.net/qq_40723205/article/details/104245340

递归

混江龙づ霸主 提交于 2020-02-10 18:18:33
递归,指在当前方法内调用自己的这种现象   注意 : 1.必须有出口,否则无意义       2.构造方法不能递归       3.递归次数不能过多 递归分为两种,直接递归和间接递归。     直接递归称为方法自身调用自己。    间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法 例子1-3的和内存图    package com.oracle.demo03; public class Demo02 { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(add(5)); } //用递归计算1-n的和 /*1-100= * 100+99+98--+1 * 100+(100-1)+(99-1)+..+1 * n+(n-1)+(n-1-1)+(n-1-1-1)+...+1 * */ public static int add(int n){ if (n==1) { return 1; }else{ return n+add(n-1); } } }    1.递归打印所有子目录中的文件路径 步骤 1. 指定要打印的目录File对象 2. 调用getFileAll()方法 2.1 获取指定目录中的所有File对象 2.2

LeetCode235-二叉搜索树的最近公共祖先

点点圈 提交于 2020-02-10 04:58:47
根据236的做法,这个就简单了。 递归主要费时间的地方是,分别去左右子树去找,有没有p和q。 利用搜索树的性质,减少递归的次数 如果p和q都小于root,去左边找就行。 如果p和q在两侧的,直接就是root,这个可以通过val来判断。 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { //返回条件一样 //如果往下的过程中,先遇到p或者q,它就是最近祖先 if(root==null||root==p||root==q) return root; //都在左边,那p和q都在左子树下,返回左子树递归的结果就好 if (p.val<root.val&&q.val<root.val){ return lowestCommonAncestor(root.left,p,q); }else if(p.val>root.val&&q.val>root.val){ return lowestCommonAncestor(root.right,p,q); }else { //val一个大于一个小于,直接就是自己的 return root; } } 来源: https://www.cnblogs.com/weizhibin1996/p/9695118.html

005-Java方法

有些话、适合烂在心里 提交于 2020-02-09 22:25:55
目标 1.理解什么是方法 2.掌握方法的声明格式 3.掌握方法的使用 4.掌握方法的重载 5.了解递归算法 第一节:方法 1.1 什么是方法 Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段。 1.2 为什么要声明方法 1 把复用的逻辑抽取出来,封装成方法,提高代码的重用性 2 实现相对独立的逻辑,提高代码的维护性 3 可以对具体实现进行隐藏、封装 1.3 方法的作用 简化代码,提高代码的可读性,可维护性,可重用性。 1.4 方法的声明格式 语法: 访问权限修饰符 其他修饰符 返回值类型 方法名称(参数列表) { //方法体【函数体】 return 返回值;//如果返回值类型void ,可以不用写return } 1.4.1方法的分类 根据方法有没有参数,可分为: 1.无参方法 2.有参方法 根据有没有返回值,可分为: 1.无返回值方法 2.有返回值方法 上机练习: 1. 最简单的无参方法 void sum1(){ System.out.println("加法操作"); } 2. 拥有修饰符的无参方法 public static void sum2(){ System.out.println("加法操作"); } 3. 拥有参数的方法 public static void sum3(int a,int b){ System.out.pritln("两数相加结果"

回溯-递归练习题集

不想你离开。 提交于 2020-02-09 19:37:16
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/subsets 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 思路分析: 1:使用递归和回溯的思想解决 对nums从0到结束,分别把当前第nums[i]个元素放入item和不放入item,把当前item存为结果后分别递归该函数,求得子集。 void generate(int i,vector<int> &nums,vector<int> &item,vector<vector<int> > &result) { if(i >= nums.size()) { return; } item.push_back(nums[i]); result.push_back(item); generate(i+1,nums,item,result); item.pop_back(); generate(i+1,nums,item,result); } class Solution { public:

day19_File丶递归

巧了我就是萌 提交于 2020-02-09 17:04:07
File类 概述 File类是文件和目录路径名的抽象表示形式。 java把电脑中的文件和文件夹(目录)封装为了一个File类,我们可以使用File类对文件和文件夹进行操作我们可以使用File类的方法,创建一个文件/文件夹或删除文件/文件夹或获取文件/文件夹或判断文件/文件夹是否存在或对文件夹进行遍历或获取文件的大小。File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法 。 常用的静态变量 public static String pathSeparator 与系统有关的路径分隔符,为了方便,它被表示为一个字符串。 public static char pathSeparatorChar 与系统有关的路径分隔符。 public static String separator 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。 public static char separatorChar 与系统有关的默认名称分隔符。 代码演示 package demo01; import java.io.File; public class Demo01File { public static void main(String[] args) { /* 注意:工作中获取操作路径:路径不能写死了,一定要使用下面的方式获取 "C:"+File.separator+

二叉树的遍历

淺唱寂寞╮ 提交于 2020-02-09 07:50:28
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 前序遍历 递归 void preOrder1(BinTree *root) //递归前序遍历 { if(root!=NULL) { cout<<root->data<<" "; preOrder1(root->lchild); preOrder1(root->rchild); } } 非递归 根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下: 对于任一结点P: 1)访问结点P,并将结点P入栈; 2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P; 3)直到P为NULL并且栈为空,则遍历结束。 void preOrder2

二叉树三种遍历方式的非递归实现

南楼画角 提交于 2020-02-09 07:50:11
1、二叉树的先序遍历。 节点->左孩子->右孩子 用递归很容易解决,但是会遇到内存溢出情况。用栈可以解决找个问题。 根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下:   对于任一结点P: 1)访问结点P,并将结点P入栈; 2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P; 3)直到P为NULL并且栈为空,则遍历结束。 1 public void xianxu(TreeNode root){ 2 Stack<TreeNode> stack = new Stack<>(); 3 TreeNode p = root; 4 while ( !stack.isEmpty() ){ 5 while ( p != null ){ 6 System.out.println(p.val); 7 stack.push(p); 8 p = p.left; 9 } 10 if ( !stack.isEmpty() ){ 11 p = stack.pop(); 12 p = p.right; 13 } 14 } 15