【问题标题】:Python: Unexpected result in a recursive functionPython:递归函数的意外结果
【发布时间】:2019-09-29 08:15:27
【问题描述】:

我写了一个递归函数来衡量,例如列表深度,由于某种原因,它返回了意想不到的结果。

我有两个功能: 1. 检查对象是否可迭代 2. 测量物体的深度,例如列表

我想我在第二个函数中遗漏了一些东西,但我无法理解为什么从 else 返回的变量 n 会变成一个有趣的结果。 我设置了print 以查看n 在每个阶段是如何变化的,它似乎按预期工作,但是当从else 返回时,它变成了错误的数字。

这是两个函数的代码:

def isiterable(obj):
    '''
    takes in an obj and returns 1 if iterable or 0 if not
    strings are discarded as iterable
    :param obj: any object
    :return: int
    '''
    if isinstance(obj, str):
        return 0
    else:
        try:
            iter(obj)
            return 1
        except TypeError as err:
            return 0

我的第二个函数在遇到问题时是递归的

def get_depth(a, n=0):

    if isiterable(a):
        return n + f(a[0], n+1)

    else:
        return n 

我有三个例子:

a = [[[1,2], [3,4]], [[5,6],[7,8]]]
b = [[1,2], [2,3]]
c = [2]

我希望 get_depth 为列表 a 返回 3,为列表 b 返回 2,为列表 c 返回 1。

由于某种原因,a 的结果加倍并返回 6。在b 的情况下,它是 3 而不是 2。

非常感谢

【问题讨论】:

    标签: python-3.x recursion


    【解决方案1】:

    get_depth返回时无需添加n

    def get_depth(a, n=0):
    
        if isiterable(a):
            return get_depth(a[0], n+1)
    
        else:
            return n 
    

    因为当a有更多的深度时,你会用n+1再次计算get_depth函数,它已经正确计算了深度,不需要额外的。

    顺便说一句,你得想想万一这种情况怎么办?

    d = [1, 2, [3, 4]]
    

    我可以修改一下,比如:

    def get_depth(a, n=0):
    
        if isiterable(a):
            temp = []
            for i in range(0, len(a)):
                temp.append(get_depth(a[i], n+1))
    
            return max(temp)
    
        else:
            return n 
    

    【讨论】:

    • Lamanus 感谢您的回复!是的,我有另一个处理输入的函数。你的实际上看起来很酷 :) 如果你不介意,我可能会在其他任务中使用它)
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2019-11-26
    • 2019-11-22
    • 2022-08-22
    • 1970-01-01
    • 2017-08-31
    • 2023-01-25
    • 1970-01-01
    相关资源
    最近更新 更多