python算法:矩形覆盖
一,认识递归函数
1,什么是递归?
递归的工作原理是,如果函数需要处理的问题大小合适,则直接求解并返回结果,
否则将问题分解成两个或多个更小的子问题,并对子问题进行相同的处理,
直到问题无法分解为止
2,什么是递归函数:
递归函数(recursive function)是指在函数体中可以调用自己的函数
3,语法
def fn():
# ...
if condition:
# 停止自我调用
else:
fn()
# ...
4,递归函数的优点和缺点
递归函数的优点:它们可以帮助程序员在处理复杂问题时提供一种简单且易懂的解决方案。
递归函数使代码具有可读性和可重用性,
而且可以使用递归函数解决使用其他方法难以处理的问题。
递归函数的缺点: 递归函数可能会在运行时占用较多的系统资源,
因为它们需要在堆栈上存储多个函数调用
其次,递归函数可能导致代码变得不容易理解,
因为它具有一定的复杂度
说明:刘宏缔的架构森林—专注it技术的博客,
网址:https://imgtouch.com
本文: https://blog.imgtouch.com/index.php/2024/03/26/python-suan-fa-ju-xing-fu-gai/
代码: https://github.com/liuhongdi/ 或 https://gitee.com/liuhongdi
说明:作者:刘宏缔 邮箱: 371125307@qq.com
二,矩形覆盖题目与解析
1,题目:
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。
请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
2,解析:
宽度为1时,即当n = 1时,只有一种覆盖方法,即 f(1) = 1
宽度为2时,即当n = 2时,有两种覆盖方法:横着两个或竖着两个,即 f(2) = 2
假设n=3,则分为两种情况:
第一种情况:用一个矩形竖着覆盖(右图阴影),则剩下共有2种方法,
即只需解决右侧的长度n-1的覆盖方法
第二次情况:用一个矩形横着覆盖(下图阴影),则其上方或下方再添加一个矩形后,
右侧区域只剩下图示一种方法,
所以需要解决长度为1的覆盖方法,即只需解决右侧的长度n-2的覆盖方法
3,总结:
归纳为数学方程式:
它的数列的形式:
1,2,3,5,8,13,21,34,55,89…
与斐波那契数列很相似,
它也可以用循环来解决
三,编写代码:
1,递归函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 递归函数 # n: 矩形的长度 def rect(n): if n < = 0 : # 值小于等于0时,返回0,递归终止 return 0 elif n = = 1 : # 值小于等于1时,返回1,递归终止 return 1 elif n = = 2 : # 值小于等于2时,返回2,递归终止 return 2 else : # 值大于2时,返回覆盖长度n-1矩形方法和长度n-2矩形方法的和 return rect(n - 1 ) + rect(n - 2 ) num = int ( input ( "请输入矩形的长度:" )) print (f "矩形长度为{num}时,共有覆盖方法{rect(num)}种" ) |
运行结果:
请输入矩形的长度:5
矩形长度为5时,共有覆盖方法8种
2,循环:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 函数,返回矩形长度为n时覆盖它时的方法数量 # n: 矩形的长度 def rect(n): if n = = 1 : return 1 elif n = = 2 : return 2 pre1 = 1 # 前两个数中的第1个 pre2 = 2 # 前两个数中的第2个 res = 0 # 覆盖方法的数量 for i in range ( 3 , n + 1 ): res = pre1 + pre2 # 得到当前的数量 pre1 = pre2 # 为下次循环,原前2个数中的第1个变为现在的第2个 pre2 = res # 前2个数字中的第2个变为当前数字 return res num = int ( input ( "请输入矩形的长度:" )) print (f "矩形长度为{num}时,共有覆盖方法{rect(num)}种" ) |
运行结果:
请输入矩形的长度:5
矩形长度为5时,共有覆盖方法8种