递归学习中碰到的坑

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)]

 

















以上是关于递归学习中碰到的坑的主要内容,如果未能解决你的问题,请参考以下文章

HMTL5的 video 在IOS7中碰到的坑

记录使用git submodule时踩的坑

解决spring-boot启动中碰到的问题:Cannot determine embedded database driver class for database type NONE(转)(代码片段

记录python上传文件的坑

javascript 角新手容易碰到的坑

如何用ffmpeg截取视频片段&截取时间不准确的坑