递归调用

递归算法之基础练习

拜拜、爱过 提交于 2020-02-11 23:54:40
递归的定义: 一个函数自己直接或间接调用自己。 我们只要把下面两个基本的问题搞明白就差不多理解了递归的含义。 ( 这里需要注意的是我们写递归的时候一定要有个递归出口、不然会导致栈溢出异常 ) /** * 递归的复习与巩固 * @author qiu * 定义:一个函数自己直接或间接调用自己。 */ public class Recursion { public static void main ( String [ ] args ) { //求阶乘 n!的问题可以看成n*(n-1)! int num = factorial ( 10 ) ; System . out . println ( num ) ; //求1+2+3....+n的和 int sum = factorial1 ( 5 ) ; System . out . println ( sum ) ; } public static int factorial ( int N ) { //递归函数 if ( N == 1 || N == 0 ) { //递归结束出口 return 1 ; } else if ( N < 0 ) { //递归结束出口 return - 1 ; } else { return N * factorial ( N - 1 ) ; } } private static int factorial1

关于递归的一些小练习

一笑奈何 提交于 2020-02-11 06:59:31
递归 什么是递归 在程序中, 所谓的递归, 就是函数自己直接或间接的调用自己. 直接调用自己 间接调用自己 就递归而言最重要的就是跳出结构. 因为跳出了才可以有结果. 所谓的递归就是化归思想 递归的调用, 写递归函数, 最终还是要转换为自己这个函数. 假如有一个函数 f, 如果它是递归函数的话, 那么也就是说 函数体内的问题还是转换为 f 的形式. 递归思想就是将一个问题转换为一个已解决的问题来实现 function f() { ... f( ... ) ... } 例子: 1, 2, 3, 4, 5, ..., 100 首先假定递归函数已经写好, 假设是 foo. 即 foo( 100 ) 就是求 1 到 100 的和 寻找递推关系. 就是 n 与 n-1, 或 n-2 之间的关系: foo( n ) == n + foo( n - 1 ) var res = foo( 100 ); var res = foo( 99 ) + 100; 将递推结构转换为 递归体 function foo( n ) { return n + foo( n - 1 ); } * 将 求 100 转换为 求 99 * 将 求 99 转换为 求 98 * ... * 将求 2 转换为 求 1 * 求 1 结果就是 1 * 即: foo( 1 ) 是 1 将临界条件加到递归体中 function foo(

php实现快速排序

老子叫甜甜 提交于 2020-02-11 05:14:53
首先我们要理解一下快速排序的原理: 找到当前数组中的任意一个元素(一般选择第一个元素),作为标准,新建两个空数组,遍历整个数组元素, 如果遍历到的元素比当前的元素要小,那么就放到左边的数组,否则放到右面的数组,然后再对新数组进行同样的操作, 不难发现,这里符合递归的原理,所以我们可以用递归来实现。 使用递归,则需要找到递归点和递归出口: 递归点:如果数组的元素大于1,就需要再进行分解,所以我们的递归点就是新构造的数组元素个数大于1 递归出口:我们什么时候不需要再对新数组不进行排序了呢?就是当数组元素个数变成1的时候,所以这就是我们的出口。 理解了原理,来看一下代码实现~ <?php //快速排序 //待排序数组 $arr=array(6,3,8,6,4,2,9,5,1); //函数实现快速排序 function quick_sort($arr) { //判断参数是否是一个数组 if(!is_array($arr)) return false; //递归出口:数组长度为1,直接返回数组 $length=count($arr); if($length<=1) return $arr; //数组元素有多个,则定义两个空数组 $left=$right=array(); //使用for循环进行遍历,把第一个元素当做比较的对象 for($i=1;$i<$length;$i++) { /

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) 的值之间的联系。 递归算法的执行过程, 一个正确的递归程序虽然每次调用的是相同的子程序,但它的参量、输入数据等均有变化。 在正常的情况下,随着调用的不断深入,必定会出现调用到某一层的函数时

递归

混江龙づ霸主 提交于 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

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+

Java-方法的使用-递归求解汉诺塔问题

北战南征 提交于 2020-02-08 17:09:47
递归求解汉诺塔问题 ​ 汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。 并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。 问应该如何操作? 对问题的分析: 将n个盘子从A座上移到C座上可分解为以下三个步骤: (1)将A上的n-1个盘子借助C先移到B上; 递归方法分解为: · 将A上1个盘子从A移到C; · 将A上1个盘子从A移到B; · 将C上1个盘子从C移到B; (2)将A座上剩下的一个盘移到C座上; (3)将n-1个盘从B座借助于A座移到C座上; 递归方法分解为: · 将B上1个盘子从B移到A; · 将B上1个盘子从B移到C; · 将A上1个盘子从A移到C; 其中步骤(1)和步骤(3)都是将n-1个盘从一个座移到另一个座上,采取的办法一样,只是座的名字不同。为了使之一般化,可以将步骤(1)和步骤(2)表示为: 将“one”座上的n-1个盘移到“two”座(借助“three”座) 在步骤(1)中: one对应A,two对应B,three对应C 在步骤(3)中: one对应B,two对应C,three对应A 所以

python 递归遍历目录

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-08 12:34:16
import osdef getAllDirRE(path, sp = ""): #得到当前目录下所有的文件 filesList = os.listdir(path) #处理每一个文件 sp += " " for fileName in filesList: #判断是否是路径(用绝对路径) fileAbsPath = os.path.join(path, fileName) if os.path.isdir(fileAbsPath): print(sp + "目录:", fileName) #递归调用 getAllDir(fileAbsPath, sp) else: print(sp + "普通文件:", fileName) getAllDirRE("D:\python") 来源: https://www.cnblogs.com/pygo/p/12275856.html

Continuation Passing Style

孤者浪人 提交于 2020-02-07 12:08:24
CPS(Continuation Passing Style, 后续传递风格), 是指将程序的控制流显示地用 Continuation 来传递,而不是像 direct style 那样明确指出下一条语句的编码风格。符合 CPS 的函数需要一个额外的参数:一个显式的Continuation (通常为一个只有一个参数的函数)。一个CPS函数通过以返回值为参数,调用Continuation的方式来返回函数值。当我们调 用一个CPS函数式,被调用的函数需要一个额外的 return procedure 来供被调用的函数使用。用CPS的方式来表达代码可 以使普通程序中很多不明确的内容变得明确。例如,函数的返回值看起来就像是对Continuation的调用,参数的求值顺序也 变得明确,同时,尾调用(tail call)也被直接传递给调用者(caller)。 一个函数可以被自动地从 direct style 转换成 continuation passing style。当在命令式或者过程式语言的编译器中 需要表达SSA(事实上,SSA可以被视作CPS的一个子集)时,编译器可以使用CPS来表达中间代码。 正常函数的返回都隐含一个continuation,就是利用这个函数的返回值来 做的后续事情,而cps的本质就是将这个隐式的 continuation显式的当做参数传递进去

[LeetCode] 426. Convert Binary Search Tree to Sorted Doubly Linked List 将二叉搜索树转为有序双向链表

拜拜、爱过 提交于 2020-02-07 07:07:23
Convert a BST to a sorted circular doubly-linked list in-place. Think of the left and right pointers as synonymous to the previous and next pointers in a doubly-linked list. Let's take the following BST as an example, it may help you understand the problem better: We want to transform this BST into a circular doubly linked list. Each node in a doubly linked list has a predecessor and successor. For a circular doubly linked list, the predecessor of the first element is the last element, and the successor of the last element is the first element. The figure below shows the circular doubly linked