递归

学习javaScript中的函数

谁说胖子不能爱 提交于 2020-03-22 18:18:40
    今天分享一下自己对函数的认识   第一次看见函数的人都不会觉得函数很难,,因为他看起来很简单......对,很简单(个屁) <script> function fn(){ console.log('hello world') }fn(); </script>   上面就是一个简单的函数了,运行后打开控制台就能看见‘hello world’ 了,别人都说,在JavaScript中,函数有‘一等公民’的身份,小白的我开始没觉着,后面才发现,越到后面,函数用起来实在是太多了,或许这就是为啥他是‘一等公民’了;   首先我们的了解函数是个啥:   在JavaScript中,函数即对象,可以随意地被程序操控,函数可以嵌套在其他函数中定义,这样可以访问它们被定义时所处的作用域中的任何变量。 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块(摘自官方文档~)。   简而言之,函数就是一个大盒子,里面放着我们要执行的js代码,想要在哪用直接调用就行;      一、.函数的创建(两种方式)   1.声名式函数的创建:使用关键字function      2. 赋值式函数的创建:使用var 关键字创建   var fnA = function(){       console.log('你好,世界')       }   赋值式函数创建就相当于把一个函数赋值给变量fnA; 二

Java中尾递归

你。 提交于 2020-03-22 15:25:03
在以往解决需要递归求解的问题上一直使用传统递归,而不久前老师讲解了尾递归感觉需要记录一下(好记性不如烂笔头) 尾递归特点:在普通尾调用上,多出了2个特征。 1. 在尾部调用的是函数自身(Self-called) 2. 可通过优化,使得计算仅占常量栈空间(Stack Space) 举个例子: 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。 下面代码仅求斐波那契数列的第n项为多少,而不求前n项和。 1 public class Fibonacci { 2 3 public static void main(String[] args) { 4 int n = 50; 5 long begin1 = System.currentTimeMillis(); 6 System.out.printf("%d\n", fibonacci(n)); 7 long end1 = System

java数据结构之递归算法

旧城冷巷雨未停 提交于 2020-03-22 15:11:59
概述 程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。递归有直接递归和间接递归 •直接递归:函数在执行过程中调用本身。 •间接递归:函数在执行过程中调用其它函数再经过这些函数调用本身。 •表达方式: •递归算法有四个特性: (1)必须有可最终达到的终止条件,否则程序将陷入无穷循环; (2)子问题在规模上比原问题小,或更接近终止条件; (3)子问题可通过再次递归调用求解或因满足终止条件而直接求解; (4)子问题的解应能组合为整个问题的解。 下面将从以下几个典型的例子来讲解递归算法: 汉诺塔问题 如图,汉诺塔问题是指有三根杆子A,B,C。C杆上有若干碟子,把所有碟子从A杆上移到C杆上,每次只能移动一个碟子,大的碟子不能叠在小的碟子上面。求最少要移动多少次? 当n=1时: Move 1 from A to C 当n=2时: Move 1 from A to B Move 2 from A to C Move 1 from B to C 当n=3时: Move 1 from A to C Move 2 from A to B Move 1 from C to B Move 3 from A to C Move 1 from B to A Move 2 from B to C Move 1 from A to C 源代码 static

什么是递归

孤街浪徒 提交于 2020-03-22 08:40:12
一、函数递归 recursion 什么是递归: 函数直接或者间接的调用自身 示例:直接调用自身------死递归 def f(): f() f() print("递归完成") 执行结果: RecursionError: maximum recursion depth exceeded 示例:间接调用自身------死递归 def fa(): fb() def fb(): fa() fa() 执行结果: RecursionError: maximum recursion depth exceeded 递归说明: 1。 递归一定要控制递归层数,当符合某一条件时要终止递归 2。几乎所有的递归都能用循环来代替(重复的做一些事,规则相同,可用递归) 3。所有的循环都可以用递归做 4。循环对于整个运算的过程要非常清楚,而递归只要知道第N步和第N-1步直接的关系,实际上是一种数学归纳法的体现   a) 循环需要知道a n 和n的关系,然后循环求解 (这个需要数学归纳法来求解出等式)   b) 递归只需要知道a n 和 a n-1 的关系就可以 补充: 数学归纳法的基本步骤分两步: 证明当 n = 1时命题成立。 假设 n = m 时命题成立,那么可以推导出在 n = m+1 时命题也成立。( m 代表任意自然数) 对于递归的计算的实现的理解 举例: def fn(n): print("现在是第"

递归,迭代,循环,遍历

只愿长相守 提交于 2020-03-21 22:25:28
递归和迭代都是循环的一种 “递归”和“迭代”的区别如下: 1、递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合。 2、迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B。 3、递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换.能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出。 遍历是依次对集合中的每个元素做且仅做一次访问。 来源: https://www.cnblogs.com/agnesFlower/p/12542529.html

Java方法的嵌套与递归调用

一世执手 提交于 2020-03-21 17:50:22
Java方法的嵌套与递归调用 本文关键字:方法、嵌套、递归、经典问题 一、方法的嵌套 1. 概念解读 方法嵌套的概念其实比较好理解,就是在调用方法的过程中又遇到了方法的调用,在刚开始接触的时候虽然在逻辑上能够理解为什么运行结果是这样的,但是对于代码执行的过程还是感觉有些绕。 2. 方法嵌套 在编程中最常见的就是方法与方法之间的调用嵌套,因为通常情况下,我们解决一个问题不会只靠一个方法。而且如果一个方法所提供的功能十分强大,那势必其中的代码逻辑和参数列表也会变的相对复杂,不利于修改和使用,所以我们希望,每个方法都是一个个小小的利刃,用来解决特定的问题,通过组合使用的方式来完成一个较为复杂的功能,就像雷恩的七星刀一样。 比如,我们已经有了两个方法:分别用于计算圆的面积和计算矩形的面积,如果我们现在需要算一个圆柱的表面积,我们还需要把整个方法重写一遍吗?当然不需要,因为圆柱的表面积的计算刚好可以通过两个圆柱底面积(圆)加圆柱侧面积(矩形)得到,我们只需要合理的传入参数和进行值的返回即可实现。 public class Test{ public static void main(String[] args){ // 计算一个圆柱的面积,已知底面半径和高 int radius = 5; int height = 10; // 调用计算圆柱表面积 double area =

全排列之递归与非递归算法实现总结

放肆的年华 提交于 2020-03-21 17:01:55
全排列之递归与非递归算法实现总结 递归实现 常见的是基于交换的,原理:从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}。 因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。当n = 1时perm(p} = r1。意思即是,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列, 如果有重复数字,则第一个数每次与后面的不同数字交换; 关键代码 Void perm(list,k,m) { If(k>m) print(list) Else { For(i=k; i<=m;i++) { Swap(&list[k],&list[i]) Perm(list,k+1,m) Swap(&list[k],&list[i]) } } } 上面这种方法可以顺序打印出所有排列,但是无序的,也无法打印出第n个排列,下面这种递归实现可以升序打印出所有排列;如果要打印第n个排列,加一个计数器就可以,但需要先生成前n-1个排列,不划算; Vector result; //存放一个排列 Bool visited; //初始化为false Void perm(list,n) {  If(result.size() >= n) print

Karatsuba乘法递归计算

吃可爱长大的小学妹 提交于 2020-03-21 10:40:02
技术有限,先第一版,Karatsuba乘法递归计算x*y 循环调用部分 a,b=x的前半部分,后半部分 c,d=y的前半部分,后半部分 a,b,c,d都长度为n/2 (x*y)可写成:(a+b)*(c+d)=ac+ad+bc+bd x*y=ac*10**n+(ad+bc)*10**(n/2)+bd 递归核心在于把a*c当中x*y,写为 a,b=x的前半部分,后半部分 c,d=y的前半部分,后半部分 a,b,c,d都长度为n/4 (x*y)可写成:(a+b)*(c+d)=ac+ad+bc+bd x*y=ac*10**n+(ad+bc)*10**(n/2)+bd ad,bc,bd同理 import datetimeimport time'''假设x,y长度都是2的幂次方倍。'''def gui(i): # 递归测试 if i==1: return i else: return i+gui(i-1)x=12345678y=56784321n=len(str(x)) #x的长度def Karatsuba_digui(x,y,n): ''' 假设x、y的长度是2^n倍的整数 :param x: 被输入乘数 :param y: 乘数 :return: x*y ''' if n==1: return x*y else: midle_len = n / 2 a,b=x//(10**midle

递归函数

别来无恙 提交于 2020-03-21 04:31:37
一、初始递归 递归函数:在一个函数里在调用这个函数本身。 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了 997 (只要997!你买不了吃亏,买不了上当...). 拿什么来证明这个“998理论”呢?这里我们可以做一个实验: def foo(n): print(n) n += 1 foo(n) foo(1) 由此我们可以看出,未报错之前能看到的最大数字就是998.当然了,997是python为了我们程序的内存优化所设定的一个默认值,我们当然还可以通过一些手段去修改它: import sys print(sys.setrecursionlimit(100000)) 我们可以通过这种方式来修改递归的最大深度,刚刚我们将python允许的递归深度设置为了10w,至于实际可以达到的深度就取决于计算机的性能了。不过我们还是不推荐修改这个默认的递归深度,因为如果用997层递归都没有解决的问题要么是不适合使用递归来解决要么是你代码写的太烂了~~~ 看到这里,你可能会觉得递归也并不是多么好的东西,不如while True好用呢!然而,江湖上流传这这样一句话叫做

[知识点]动态规划基础

ぃ、小莉子 提交于 2020-03-20 16:30:51
一、前言 最近又做了一些比较基础的DP,感觉自己无敌了,应该有资格写篇文章来介绍了! 本文主要介绍动态规划的概念,记忆化搜索以及动态规划的核心。 二、介绍 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。其本质是将一个复杂的问题拆分成若干个相对简单的子问题,所以常适用于有重叠子问题和最优子结构问题。 这样介绍动态规划是很空洞而抽象的,我们从更简单的方式切入。 三、记忆化搜索?动规? 山洞里有 m 株不同的草药,第 i 株草药的价值为v[i],采第 i 株草药需要时间 t[i]。在时间 T 内,要求采集一些草药,使总价值最高。 不知道动规碰到这道题的唯一方法为 暴力搜索 ——进行DFS,对于每一株有选与不选两个选项,从第 1 株开始逐一进行二选一,如果出现时间超过限定则回溯;直到对 m 株都进行了选择,记录当前的价值并和最大价值比较,选择较大值,以此反复,可得最优解。核心代码如下: 1 void dfs(int o, int ot, int ov) { 2 if (ot > T) return; 3 if (o == m + 1) { 4 ans = max(ans, ov); 5 return; 6 } 7 dfs(o + 1, ot, ov); 8 dfs(o + 1, ot + t[o],