码迷,mamicode.com
首页 > 其他好文 > 详细

递归学习中碰到的坑

时间:2018-07-13 13:15:58      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:运行   清空   iso   部分   recursion   error   return   应该   测试   

例题

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

 

递归学习中碰到的坑

标签:运行   清空   iso   部分   recursion   error   return   应该   测试   

原文地址:https://www.cnblogs.com/inkyang/p/9304271.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!