递归学习中碰到的坑
Posted inkyang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归学习中碰到的坑相关的知识,希望对你有一定的参考价值。
例题
2. 我好方
完成函数 i_like_square(length, width)
,存在一个长方形,整数参数 length
和 width
是长方形的长和宽。
函数从长方形中切出一个尽可能大的正方形,再从剩下的部分里再切出一个尽可能大的正方形,如此不断重复,直到长方形被全部切光。
比如长方形长和宽分别是 6 和 4,则最大可以切出边长为 4 的正方形;剩余一个长、宽为 4 和 2 的长方形,最大可以切出边长为 2 的正方形;剩余一个长和宽都为 2 的长方形,可以切出边长为 2 的正方形,此时长方形被完全切完。
按先后顺序,将切出来的所有正方形的边长存入列表并返回。
要求必须用递归解决,给出的测试例子为长6宽4
def i_like_square(length, width):
# 测试:[4, 2, 2] i_like_square(6, 4)
简单查看给出的例子 length = 6 , width = 4 。划分出的 4 2 2 ,是按照宽在长方形内进行截取正方形,剩下的面积里再按短边长进行截取;
结果是一个列表,说明返回值肯定是一个list;
递归必须要有终止条件
第一遍:
def i_like_square(length, width): square = [] if length == width: square.append(length) return square else: square.append(width) square.append(i_like_square(width,length))
错的比较离谱,我们可以看到,函数中定义的square在每次运行函数的时候会被清空。所以无法实现记录每次的宽度。
经过这次,我把重点放在返回值上,直接返回列表。
def i_like_square(length, width): if length == width: return [length] else: return [width,i_like_square(width,length-width)]
最后返回值为 [4, [2, [2]]]
然后解开列表
def i_like_square(length, width): if length == width: return [length] else: return [*[width],*i_like_square(width,length-width)]
看起来,输出正常了,
in:
i_like_square(6, 4)
out:[4, 2, 2]
但是!!但是!!!这是个坑啊!!
in:
i_like_square(5, 4)
报错:RecursionError: maximum recursion depth exceeded in comparison
回到问题本身,应该是终止条件出错了。重新整理了一下,要是输入的是(8,4)呢?,应该是长边能否被短边整除,不能整除再进行不对等切割才对。所以最后
def i_like_square(length, width): if length%width == 0:#终止条件:长能被宽整除 return length//width * [width] else: k = length//width return [*[width] * k,*i_like_square(width, length-k*width)]
以上是关于递归学习中碰到的坑的主要内容,如果未能解决你的问题,请参考以下文章
解决spring-boot启动中碰到的问题:Cannot determine embedded database driver class for database type NONE(转)(代码片段