递归调用

Python递归

谁说我不能喝 提交于 2020-03-23 18:47:12
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 def age(n): if n == 1: return 10 # 结束条件 else: return age(n-1) + 2 # 调用函数本身 print(age(5)) 结果: 18 递归的原理 print(data) if len(data)> 1: # 判断当列表的长度大于1的时候,进行二分法递归运算 mid_index=int(len(data)/2) # 取中间的得索引位置 mid_value=data[mid_index] # 中间位置的值 if num < mid_value: # 当输入的值比中间的值小的情况 data = data[:mid_index] # 切片操作,把左侧到索引值的列表重新复制给data search(num,data) # 调用函数本身 elif num > mid_value: #  data = data[mid_index:] search(num,data) else: print("you get it") return # 这是结束条件 else: # 这是当列表的长度是1的时候 if num == data[0]: #现在只有一个元素 print("you get it") else: print("no exits") search

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("现在是第"

递归 实例1

狂风中的少年 提交于 2020-03-22 07:44:20
已知有列表:L = [[3,5,8],10,[[13,14],15],18]1)写出一个函数print_list(lst)打印出列表中所有数字print_list(L)2)写出一个函数sum_list(lst)返回列表中所有数字的和print_list(sum_list(L))注:type(x) 可以返回一个变量的类型L = [[3,5,8],10,[[13,14],15],18] def print_list(L): for x in L: if type(x) != list: #判断对应元素是一个列表还是数值,如果是数值直接打印 print(x,end=' ') else: #否则调用print_list()递归的将对应列表内元素进行打印 print_list(x) print_list(L) 执行结果: 3 5 8 10 13 14 15 18 def sum_list(lst): val = 0 for x in lst: if type(x) != list: val += x else: val+=sum_list(x) return val print(sum_list(L)) 执行结果: 86    来源: https://www.cnblogs.com/vincent-sh/p/12543948.html

递归,迭代,循环,遍历

只愿长相守 提交于 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 =

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好用呢!然而,江湖上流传这这样一句话叫做

全排列算法--递归实现(Java)

我的梦境 提交于 2020-03-20 11:06:00
求一个n阶行列式,一个比较简单的方法就是使用全排列的方法,那么简述以下全排列算法的递归实现。 首先举一个简单的例子说明算法的原理,既然是递归,首先说明一下出口条件。以[1, 2]为例 首先展示一下主要代码(完整代码在后面),然后简述   //对数组array从索引为start到最后的元素进行全排列 public void perm(int[]array,int start) { if(start==array.length) { //出口条件 for(int i=0;i<array.length;i++) { // this.result[row][i] = array[i]; System.out.print(array[i]+" "); } // System.out.print(++this.row+": "); // System.out.println("逆序数是:"+ this.against(array)); System.out.print('\n'); } else { for(int i=start;i<array.length;i++) { swap(array,start,i); //交换数组array中索引为start与i的两个元素 perm(array,start+1); swap(array,start,i); } } } 首先数组[1, 2]分析