python25-递归算法
课程:B站大学
记录python学习,直到学会基本的爬虫,使用python搭建接口自动化测试就算学会了,在进阶webui自动化,app自动化
递归算法
- 递归的基本原则
- 递归的使用
- 作业小tips:
- 斐波那契数列
- 阶乘
- 快速排序
- 实践是检验真理的唯一标准
递归的基本原则
递归函数通常遵循以下原则:
- 定义基本情况 确定一个或多个输入的特殊情况,当满足这些条件时,递归函数将直接返回结果而不再调用自身。
- 减小问题规模 通过调用自身来解决一个规模更小的问题,这样每次递归调用都在问题规模上取得了进展。
也就是需要一个已定义好的规则来使其它非基本的情况转化为基本情况。 - 终止条件 递归函数必须包含能够导致函数不再递归调用的条件,以避免无限递归。
递归的使用
数学中有一个比较经典的递归算式就是求阶乘
一个正整数的阶乘 factorial 是所有小于及等于该数的正整数的积,并且 0 的阶乘为 1。自然数 n 的阶乘写作 n!。
对阶乘的定义进行分析:
首先定义 f(n) 为阶乘函数。它的结果就是阶乘计算之后的值。
从定义中能得到基本情况为: f(0) = 1, f(1) = 1
其它情况: f(2) = 21 = 2f(1),f(3) = 321 = 3*f(2) 即 f(n) = f(n-1) * n
示例:
def f(n):"""实现计算 n 的阶乘return:n 阶乘计算之后的值"""if n == 0 or n == 1:# 对应基本情况return 1return f(n - 1) * n # 对应递归情况
大多数情况下的递归操作都可以使用循环所替代。
在使用递归时,要注意避免陷入无限调用而产生的内存溢出。
作业小tips:
斐波那契数列
编写一个Python程序,使用递归算法,生成并输出斐波那契数列的前n项,其中n是用户指定的正整数。斐波那契数列,又称黄金分割数列,指的是:1、1、2、3、5、8、13、21、34…从第三个数开始,每个数字都是前两个数字之和。
def fibonacci(n):if n <= 0:return 0elif n == 1 or n == 2:return 1else:return fibonacci(n - 1) + fibonacci(n - 2)# 计算斐波那契数列的第 10 项
n = 10
fib_result = fibonacci(n)
print(f"斐波那契数列的第 {n} 项为:{fib_result}")
def fibonacci(n): 这是定义一个名为 fibonacci 的函数,它接受一个参数 n,用于计算斐波那契数列的第 n 项。if n <= 0: 这是一个条件判断语句,用于检查 n 是否小于等于 0。return 0 如果 n 小于等于 0,返回 0。elif n == 1 or n == 2: 这是另一个条件判断语句,检查 n 是否等于 1 或 2。return 1 如果 n 等于 1 或 2,返回 1。return fibonacci(n - 1) + fibonacci(n - 2) 这是递归的部分。当 n 大于 2 时,递归地调用 fibonacci 函数来计算第 n-1 项和第 n-2 项的和,然后返回结果。fib_result = fibonacci(n) 调用 fibonacci 函数,传入参数 n,计算斐波那契数列的第 10 项。print(f"斐波那契数列的第 {n} 项为:{fib_result}") 打印计算结果,显示斐波那契数列的第 10 项的值。
阶乘
编写一个Python程序,使用递归算法,计算给定正整数n的阶乘。阶乘的定义是从1到n所有正整数的乘积。例如3的阶乘为123=6。
def factorial(n):
if n == 0 or n == 1:return 1else:return n * factorial(n - 1)n = int(input("请输入要计算阶乘的正整数:"))
result = factorial(n)
print(f"{n}的阶乘是:{result}")
快速排序
思路:
- 首先选择一个基准元素,通常是选择待排序列表的第一个元素。
- 将列表分成两部分,小于基准元素的元素放在左边,大于基准元素的元素放在右边。这个过程称为分区(partition)。
- 递归地对左右两个分区进行快速排序。也就是将左边的分区作为新的子列表,再次选择基准元素,并进行分区操作。对右边的分区也是同样的操作。
- 递归的结束条件是分区中只有一个元素或为空,此时分区已经是有序的。
- 最后将所有的分区合并起来,即可得到排好序的列表。
def quickSort(arr):if len(arr) <= 1:return arrpivot = arr[len(arr) // 2] # 选取数组中间元素作为基准值left = [x for x in arr if x < pivot] # 小于基准值的部分放在左边列表middle = [x for x in arr if x == pivot] # 等于基准值的部分放在中间列表right = [x for x in arr if x > pivot] # 大于基准值的部分放在右边列表return quickSort(left) + middle + quickSort(right) # 合并结果返回