7-5Python之递归函数

Python之递归函数
在函数内部,可以调用其他函数。

如果一个函数在内部调用自身本身,这个函数就是递归函数。

举个例子,我们来计算阶乘n! = 1 * 2 * 3 * ... * n,用函数fact(n)表示,可以看出:
所以,fact(n)可以表示为n * fact(n-1),只有n=1时需要特殊处理。

于是,fact(n)用递归的方式写出来就是:
上面就是一个递归函数。

可以试试:
如果我们计算fact(5),可以根据函数定义看到计算过程如下:
递归函数的优点是定义简单,逻辑清晰。

理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

使用递归函数需要注意防止栈溢出。

在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。

由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

可以试试计算fact(10000)。

任务
汉诺塔(/view/191666.htm) 的移动也可以看做是递归函数。

我们对柱子编号为a, b, c,将所有圆盘从a移到c可以描述为:
如果a只有一个圆盘,可以直接移动到c;
如果a有N个圆盘,可以看成a有1个圆盘(底盘)+ (N-1)个圆盘,首先需要把(N-1) 个圆盘移动到b,然后,将a的最后一个圆盘移动到c,再将b的(N-1)个圆盘移动到c。

请编写一个函数,给定输入n, a, b, c,打印出移动的步骤:
move(n, a, b, c)
例如,输入move(2, 'A', 'B', 'C'),打印出:
A --> B
A --> C
B --> C。

合集下载

python——递归函数

python——递归函数

python——递归函数递归函数1. 递归函数的定义:函数直接或间接的调⽤函数本⾝,则称该函数为递归函数。

也就是说,如果在⼀个函数内部,调⽤⾃⾝本⾝,那么这个函数就称为递归函数。

2. 计算阶乘的算法就⽤到了递归函数,func(n)= n * func(n-1)1#定义函数2 >>> def func(n):3if n==1:4return 15return n*func(n-1)67#调⽤函数8 >>> func(1)9 110 >>> func(5)11 12012 >>> func(100)13 9332621544394415268169923885626670049071596826438162146859296389521759999322991560894146397615651828625369792082722375825118521091686400000000000000000003. 递归函数的优点是逻辑简单清晰,缺点是过深的递归容易导致栈溢出4. 尾递归:为了解决递归调⽤栈溢出的问题。

尾递归是指,在函数返回的时候,调⽤⾃⾝,并且 return 语句中不能包含表达式。

尾递归和循环的效果⼀样,可以把循环看成⼀种特殊的尾递归函数。

⽤尾递归实现阶乘算法:1 >>> def func(n):2return func_iter(n,1)34 >>> def func_iter(num,product):5if num==1:6return product7return func_iter(num-1,num*product)尾递归调⽤时,如果做了优化,栈不会增长,因此,⽆论多少次调⽤也不会导致栈溢出。

遗憾的是,⼤多数编程语⾔没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上⾯的 func(n)函数改成尾递归⽅式,也会导致栈溢出5.汉诺塔问题:1 >>> def move(n,a,b,c): #n为圆盘数,a代表初始位圆柱,b代表过渡位圆柱,c代表⽬标位圆柱2if n==1:3print(a,'-->',c)4else:5#将初始位的n-1个圆盘移动到过渡位,此时初始位为a,上⼀级函数的过渡位b即为本级的⽬标位,上级的⽬标位c为本级的过渡位6 move(n-1,a,c,b)7print(a,'-->',c)8#将过渡位的n-1个圆盘移动到⽬标位,此时初始位为b,上⼀级函数的⽬标位c即为本级的⽬标位,上级的初始位a为本级的过渡位9 move(n-1,b,a,c)101112 >>> move(3,'A','B','C')13 A --> C14 A --> B15 C --> B16 A --> C17 B --> A18 B --> C19 A --> C。

Python递归函数详解及实例

Python递归函数详解及实例

Python递归函数详解及实例Python 递归函数如果⼀个函数体直接或者间接调⽤⾃⼰,那么这个函数就称为递归函数.也就是说,递归函数体的执⾏过程中可能会返回去再次调⽤该函数.在python⾥,递归函数不需要任何特殊的语法,但是它需要付出⼀定的努⼒去理解和创建.我们会以⼀个简单的例⼦开始:写⼀个函数求⼀个⾃然数中所有数字的和.在设计递归函数的时候,我们会寻找能把问题分解成简单的问题的⽅法.在这道题中,运算符%和//可以⽤来把⼀个数分成两部分:最低位和不包含最低位数字两部分.18117的数字和为:1+8+1+1+7=18.这样我们就可以分割这个数.把这个数分割成最低位7和不包含最低位数字的和1+8+1+1=11.这种分割⽅法给我们提供了⼀个算法:通过最低位n%10与n//10的数字之和相加来计算数n的数字之和.这种⽅法存在特殊情况:如果⼀个数只有⼀位,那么它的数字之和就是它本⾝.这个算法可以⽤递归函数实现.def sum_digit(n):"""return the sum of the digit of positive integer n."""if n < 10:return nelse:last = n % 10all_but_last = n // 10return sum_digit(all_but_last) + last函数sum_digit的定义是完整和正确的,即使sum_digit函数在⾃⾝的函数体⾥被调⽤.这样求⼀个数的数字之和的问题就被分解成了两部分:求除去最低位部分数字之和,然后加上最低位.这两个步骤全都⽐原问题要简单.这个函数是递归的,因为第⼀步的问题和原问题是相同类型的.也就是说,sum_digit的确实是我们需要去实现⾃然数数字求和的函数.我们可以理解这个递归函数是怎样使⽤计算环境模型成功应⽤的.它 不需要任何新的规范.感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。

python中的递归算法详解

python中的递归算法详解

python中的递归算法详解递归算法是一种在函数内部调用自身的方法。

在Python中,递归可以实现复杂的问题解决,它的实现遵循以下几个关键步骤。

第一,定义基本情况:递归算法在每一次调用中都需要判断是否达到了基本情况,即算法可以直接返回结果而不继续调用自身。

这个基本情况确保算法不会无限递归下去,而是能够找到问题的解。

第二,拆分问题:递归算法需要将大问题拆分成子问题,在每一次递归调用中解决子问题。

这样,较大的问题就会逐渐转化为较小的问题,直到最终达到基本情况。

第三,调用自身:递归算法通过调用自身来解决子问题。

在每次递归调用中,算法会传递不同的参数,以便在下一次调用中解决不同的子问题。

递归算法的关键在于它能够将复杂的问题转化为简单的子问题,并通过不断调用自身来解决这些子问题。

举个例子,考虑一个计算阶乘的递归算法:```pythondef factorial(n):# 基本情况if n == 0:return 1# 拆分问题subproblem = factorial(n - 1)# 调用自身result = n * subproblemreturn result```在这个例子中,递归算法使用了基本情况 `n == 0` 来停止递归。

当输入参数为0时,算法直接返回1,否则继续调用自身,解决 `n - 1` 的阶乘问题。

最终,算法将计算 `n` 的阶乘并返回结果。

需要注意的是,递归算法在处理大规模问题时可能会遇到效率问题。

递归算法会调用自身多次,每次调用都需要保存状态并分配栈空间,所以在某些情况下,循环迭代可能会更加高效。

因此,在使用递归算法时,需要谨慎考虑问题的规模和算法实现的复杂度,以充分利用递归的优势。

Python的递归函数

Python的递归函数

Python的递归函数Python是一种高级编程语言,而递归函数作为Python语言中一种重要的编程技巧,也是大家在学习Python时需要掌握的内容之一。

本文将从递归函数的概念、原理、使用场景以及注意事项等几个方面来详细介绍Python的递归函数。

一、递归函数的概念递归函数就是在函数定义中调用自身函数的一种特殊函数形式。

简单来说,递归函数就是通过反复调用自身函数来解决一个问题的过程。

在递归函数中,需要确定递归终止条件和递归公式两个关键要素。

递归终止条件表示在什么情况下递归终止;递归公式则表示如何将原问题转化为规模更小的同类子问题的解法。

二、递归函数的原理递归函数的核心思想是将一个大问题分解成若干个小问题,递归地解决这些小问题后,再将解决得到的结果合并起来,最终得到大问题的解。

递归函数的运行过程呈现出一种“栈调用”式的结构,每一次递归调用就相当于在栈中压入一层新的函数调用栈,待函数执行完成后再依次弹出。

例如,通过递归函数实现阶乘的计算,代码如下:def factorial(n):if n == 1:return 1else:return n * factorial(n-1)在该函数中,当n=1时,递归终止,返回值为1;否则,该函数会继续调用自身函数计算n-1的阶乘,从而实现原问题的分解。

最终递归返回的结果即为原问题的解。

三、递归函数的使用场景递归函数在实际应用中更多地用于解决数学问题、算法问题、树形结构问题等。

例如,递归函数可以用来实现快速排序、二叉树的遍历等。

同时,在一些需要高效处理数据结构问题的场景下,递归函数也能够发挥出其独特的优势。

四、递归函数的注意事项虽然递归函数在解决某些问题时可以起到十分有效的作用,但在实际编程应用的时候,需要注意以下几个问题。

1.时间复杂度问题递归函数所形成的函数调用栈在执行过程中需要不断地压入和弹出栈顶元素,因此在计算复杂度时需要考虑栈的深度。

如果递归深度较大,函数调用栈过于庞大的话,会导致栈溢出等问题的出现,进而影响程序的执行效率。

python 递归方法

python 递归方法

python 递归方法Python递归方法是一种在编程中经常使用的技术,它允许一个函数在执行过程中调用自身。

这种调用自身的方式可以有效地解决某些问题,特别是涉及到重复性操作的情况。

递归方法的基本原理是将一个大问题拆解成若干个小问题,然后通过不断调用自身来解决这些小问题,最终得到整个问题的解。

递归方法适用于那些具有递归定义的问题,比如阶乘、斐波那契数列等。

举个例子,我们来看一下如何使用递归方法计算阶乘。

阶乘是指从1到某个正整数n的所有整数的乘积。

递归方法可以通过将阶乘的计算过程拆解成多个小问题来解决。

具体实现如下:```pythondef factorial(n):if n == 0 or n == 1:return 1else:return n * factorial(n-1)# 调用递归方法计算阶乘result = factorial(5)print(result) # 输出:120```在上面的例子中,递归方法`factorial`接收一个参数n,如果n等于0或者1,则直接返回1;否则,调用自身来计算`factorial(n-1)`,并将结果与n相乘得到最终结果。

需要注意的是,使用递归方法时要注意设置递归函数的终止条件,否则可能会导致无限递归的情况发生,从而导致程序崩溃。

除了阶乘,递归方法还可以用来解决其他类型的问题,比如二叉树的遍历、图的深度优先搜索等。

但是,由于递归方法在每次调用时都会产生额外的函数调用开销,所以在处理较大规模的问题时,可能会导致性能下降。

因此,在使用递归方法时,需要谨慎评估其对性能的影响,并考虑是否有更优化的解决方案。

总的来说,递归方法是一种强大的编程技术,可以解决许多复杂的问题。

通过理解递归的原理和运行机制,并合理地设计递归函数,我们可以更好地利用递归方法来解决实际的编程任务。

Python递归函数详解

Python递归函数详解

Python递归函数详解
Python 递归函数详解
在函数内调⽤当前函数本⾝的函数就是递归函数
下⾯是⼀个递归函数的实例:
第⼀次接触递归函数的⼈,都会被它调⽤本⾝⽽搞得晕头转向,⽽且看上⾯的函数调⽤,得到的结果会是:
为什么会得出上⾯的结果呢?因为都把调⽤函数本⾝之后的代码给忘记了,就是else之后的python 代码。

实际此递归函数输出的是以下结果:
相信⼤家看到这⾥都有点蒙,⼩编也⼀样,我第⼀次看到这个递归函数时,只能理解到第⼀个结果。

那是因为,⼤部分⼈在做事情的时候,中断第⼀件事,被安排去做第⼆件事的时候,就会把第⼀件事后续的事情给忘记,如果在做第⼆件事的时候,⼜被中断,被安排去做第三件事,就会把第⼀件、第⼆件要做的后续的事情给忘记......,这就是不理解递归函数的原因。

下⾯我把此递归函数做了⼀个分解,希望能够帮到⼤家。

详解递归函数,当调⽤递归函数digui(3)时,执⾏过程如下:
应颜⾊的函数。

递归函数python例子

递归函数python例子递归是一种算法,它通过反复调用自身来解决问题。

在计算机科学中,递归函数是一种函数,它在其定义中调用自身。

递归函数可以用于解决许多问题,例如树的遍历、排序、搜索等。

Python是一种支持递归函数的编程语言,本文将介绍递归函数的基本原理和几个Python例子。

递归函数的原理递归函数的原理是将一个大问题分解成若干个小问题,然后通过递归解决每个小问题,最后将结果组合起来得到大问题的解。

递归函数需要满足两个条件:基本情况和递归情况。

基本情况是指递归函数能够直接得到答案的情况,不需要再次递归。

递归情况是指递归函数需要继续递归下去的情况。

在递归函数中,基本情况通常是通过if语句来实现的。

递归函数的基本结构如下:def function_name(parameters):if base_case:return base_case_solutionelse:recursive_case = function_name(modified_parameters)return recursive_case_solution递归函数Python例子下面将介绍几个常见的递归函数Python例子。

1. 阶乘阶乘是指从1到n的所有整数相乘的结果,通常用n!表示。

例如,5! = 5 x 4 x 3 x 2 x 1 = 120。

递归函数可以用于计算阶乘,其基本情况是n=1时,阶乘为1,递归情况是n>1时,阶乘为n乘以(n-1)的阶乘。

def factorial(n):if n == 1:return 1else:return n * factorial(n-1)2. 斐波那契数列斐波那契数列是指前两个数为1,之后每个数都是前两个数之和的数列。

例如,斐波那契数列的前10个数为1, 1, 2, 3, 5, 8, 13, 21, 34, 55。

递归函数可以用于计算斐波那契数列,其基本情况是第一个数和第二个数都是1,递归情况是第n个数等于第n-1个数和第n-2个数之和。

递归函数python

递归函数pythonPython语言是一种高级编程语言,用于解决复杂问题。

它提供了很多强大的特性,其中之一就是递归函数。

本文旨在介绍如何使用递归函数和Python语言来解决问题。

首先,让我们简单介绍一下什么是递归函数。

简单地说,递归函数是指一个函数调用自身,以解决某个问题。

它包含两个部分:一个基础情况,以及一个递归情况。

基础情况是指一个函数首先检查输入参数,然后返回一个结果。

递归情况是指函数利用自身来解决复杂问题,而不是简单的返回基础情况的结果。

在Python中,使用递归函数的最常见的场景就是通过它来计算阶乘。

阶乘是一种数学函数,它表示从1乘到某个数的乘积,即:n!=n*(n-1)*(n-2)*…*1。

例如,3的阶乘是 3! = 3*2*1 = 6。

下面是一个使用递归函数计算阶乘的Python代码:def factorial(n):if n == 0:return 1else:return n * factorial(n-1)print(factorial(5))上面的程序会输出 120,即 5!值。

除此之外,Python也可以使用递归函数来解决commonly used algorithms(常用算法),比如排序。

更进一步,递归函数也可以用来解决数据结构的问题,比如二叉树。

在使用递归函数时,一定要小心,以免因为未能正确写出递归函数而导致程序出错。

比如:用递归函数实现二叉树搜索时,要确保使用正确的节点判断条件,以免程序出错。

递归函数是一种高效的程序设计技巧,它可以解决复杂问题,极大地减少代码量。

在使用递归函数时,首先要考虑基础情况,然后再考虑递归情况,这样才能正确应用递归函数。

正确使用递归函数可以大大提高程序的效率,使用Python语言实现递归函数时,仍需要遵循上述基础规则。

python递归函数用法详解

python递归函数⽤法详解上期我们介绍了函数式编程,这期内容就是关于递归的函数内容,本期还是按照⽼规矩,给⼤家进⾏核⼼整理,内容通俗易懂,搭配实际应⽤,以供⼤家理解。

关于递归:百度解释:是指函数/过程/⼦程序在运⾏过程序中直接或间接调⽤⾃⾝⽽产⽣的重⼊现象。

在计算机编程⾥,递归指的是⼀个过程:函数不断引⽤⾃⾝,直到引⽤的对象已知。

使⽤递归解决问题,思路清晰,代码少。

但是在主流⾼级语⾔中(如C语⾔、Pascal语⾔等)使⽤递归算法要耗⽤更多的栈空间,所以在堆栈尺⼨受限制时(如嵌⼊式系统或者内核态编程),应避免采⽤。

所有的递归算法都可以改写成与之等价的⾮递归算法。

总结理解:递归就是在函数内部调⽤⾃⼰的函数被称之为递归。

实例演⽰:#直接调⽤⾃⼰:def func: print('from func') funcFunc#间接调⽤⾃⼰def foo: print('from foo') bardef bar: print('from bar') fooFoo#递归的实现:def age(n): if n == 1: return 18 return age(n-1)+2print(age(5))# age(5)=age(4)+2 第⼀次进⼊# age(4)=age(3)+2 第⼆次进⼊# age(3)=age(2)+2 第三次进⼊# age(2)=age(1)+2 第四次进⼊# age(1)=18 第五次进⼊,最后判断终⽌条件# age(n)=age(n-1)+2 #n>1 递归终⽌条件# age(1)=18 #n=1 等于终⽌条件递归的回溯与递推递推:像上边递归实现所拆解,递归每⼀次都是基于上⼀次进⾏下⼀次的执⾏,这叫递推。

回溯:则是在遇到终⽌条件,则从最后往回返⼀级⼀级的把值返回来,这叫回溯。

# 实例l =[1, 2, [3, [4, 5, 6, [7, 8, [9, 10, [11, 12, 13, [14, 15,[16,[17,]],19]]]]]]]def search(l): for item in l: if type(item) is list: search(item) else: print(item)search(l)阶乘实例代码:def fact(n): if n==1: return 1 return n * fact(n -1)上⾯就是⼀个实现阶层的递归函数,我们来试⼀试。

递归函数python

递归函数python递归函数Python是Python编程语言中一种重要的程序结构,它允许对一个函数重复调用自身,基于它们的输入参数和返回值。

它可以用来处理复杂的问题,可以大大简化程序的结构,更有效地使用计算机资源。

一、什么是递归函数递归函数是一种特殊的程序结构,它可以在一定范围内重复调用自身,它的特点是每次调用参数跟第一次调用参数有关,因此它可以处理复杂的问题,可以大大简化程序的组织形式,有效利用计算机资源。

递归函数的实现往往会出现循环重复调用的情况,通常会使用一个函数递归调用自身,每次调用前都会有一个条件,它决定了函数何时停止调用,否则就会出现无限循环。

二、Python中如何实现递归函数1、递归函数的定义Python中递归函数的实现需要先定义一个函数,它可以接受一个或多个参数,参数的类型可以是任意类型。

如果参数是某类型特定的数据,那么函数就可以像这样定义:def myrecursivefunction(parameter):// 代码实现如果参数的类型更为复杂,比如列表、字典等,那么函数就可以像这样定义:def myrecursivefunction(*args):// 代码实现2、递归函数的调用在函数内部,我们可以通过if条件语句来做出判断,如果参数满足我们的设定条件,就返回一些值,否则就通过调用自身来实现循环,代码如下:def myrecursivefunction(*args):#断参数,如果满足条件if condition:#返回一个值return somevalueelse:#则调用自身return myrecursivefunction(args)三、递归函数的应用1、递归函数的常见应用之一:求和求和这个问题是一个经典的用例,通过递归函数可以实现快速求和,也可以很清晰地展现出这个算法的实现过程:def getSum(n):if n == 1:return 1else:return n + getSum(n-1)2、递归算法的常见应用之二:全排列如果要求出一组数列的全排列组合,如[1,2,3],应该有[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1],可以通过递归实现,代码如下:def permutate(nums, result, index):if index == len(nums):result.append(nums[:])else:for i in range(index, len(nums)):# 交换nums[index], nums[i] = nums[i], nums[index]#归permutate(nums, result, index + 1)#原nums[index], nums[i] = nums[i], nums[index]四、Python中的函数的优化1、使用尾递归尾递归是一种特殊的递归,它的特点是每次循环都只有一个函数调用,通常可以使用尾递归来提高程序的性能,Python编译器会优化尾递归。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档