当前位置:首页>python>小白学python第56天之函数递归(难点重点)(1)

小白学python第56天之函数递归(难点重点)(1)

  • 2026-08-26 21:19:18
小白学python第56天之函数递归(难点重点)(1)

2.1

函数递归(难点重点)(1)

?

学前疑问

“如果一个函数在执行过程中调用了自己,那么它是应该先完成内层的自己,还是外层的自己?这个过程会不会像‘俄罗斯套娃’一样无限循环下去?它最终如何‘挣脱’自己,返回结果呢?”

1

函数递归

(1)前言

编程思想:如何利用数学模型,来解决对应的需求问题;然后利用代码实现对应的数据模

算法:使用代码实现对应的数学模型,从而解决对应的业务问题

程序 = 算法 + 数据结构

在我们经常使用的算法中,有两种非常常用的算法:递推算法 + 递归算法,专门用于解决一些比较复杂,但是拆分后相似度又非常高的程序。

(2)递推算法

递归算法:递推算法是一种简单的算法,即通过已知条件,利用特定条件得出中间推论,直至得到结果的算法。递推又分为顺推和逆推。

顺推:通过最简单的条件,然后逐步推演结果

逆推:通过结果找到规律,然后推导已知条件

递推算法案例:斐波那契数列

1   1    2    3    5    8    13    21   ...

① ② ③  ④  ⑤  ⑥ ...

第1位为1,第2位为1,第3位为2 = 1 + 1,第4位为3 = 2 + 1,依次类推...第n位结果为多少?

f(n) = f(n-1) + f(n-2)

提出问题:求斐波那契数列第15位的结果?

分析:f(15) = f(14) + f(13)

f(14) = f(13) + f(12)

f(13) = f(12) + f(11)

...

f(4)   =  f(3) + f(2)   = 3  +  1

f(3)   =  f(2) + f(1)   = 2

f(2)  =   1

f(1)   =   1

递推算法:使用while循环或for循环

# 递推算法:根据已知条件,求结果(或者根据结果求未知条件)def recusive(n):    """ 返回斐波那契数列某一位(n》=1)的结果 """    if n == 1 or n == 2:        return 1    # 开始递推f(3) = f(2) + f(1)  f(4) = f(3) + f(2)  ... f(15) = f(14) + f(13)    dict1 = {1:1, 2:1}    for i in range(3, n+1):        # f(3) = f(2) + f(1)        # f(i) = f(i-1) + f(i-2)        dict1[i] = dict1[i-1] + dict1[i-2]    return dict1[n]    # return dict1  # 输出结果:{1: 1, 2: 1, 3: 2, 4: 3, 5: 5, 6: 8, 7: 13, 8: 21, 9: 34, 10: 55, 11: 89, 12: 144, 13: 233, 14: 377, 15: 610}# 函数调用print(recusive(15))

(3)什么是递归算法

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

① 简化问题:找到最优子问题(不能再小)

② 函数自己调用自己

def func():    # 自己调用自己func()func()

(4)递归两种重要的元素

递归有两个非常重要的概念:

① 递归点:找到解决当前问题的等价函数(先解决规模比当前问题小一些的函数,依次类推,最终实现对问题的解决) => 有递有归

② 递归出口:当问题解决的时候,已经到达(必须存在)最优问题,不能再次调用函数了

注:如果一个递归函数没有递归出口就变成了死循环

今日学习完毕,课后作业:

计算第n个人的年龄,问题描述:

一个小组有n个人(n为正整数),已知第1个人 8岁,后面每个人的年龄都比前一个人大 1岁。请编写一个递归函数 calc_age(n),运用递推算法计算并返回第 n个人的年龄。

最新文章

随机文章