列表中的递归

时间:2015-02-23 22:05:24

标签: python recursion

def obsah(myList):
    def recursion(myList,deep=1,result=(None)):
        if type(myList) == list:
            for i in range(len(myList)):
                if type(myList[i]) == list:
                    deep+=1
                    recursion(myList[i],deep,result)
                else:
                    result = (deep,myList[i])
                    break
        else:
            result = (0,myList)
        return result
    return recursion(myList)

这个函数应该返回递归的部分和列表中最后一个元素的值作为元组:

 obsah(['a'])
(1, 'a')
>>> obsah([[123]])
(2, 123)
>>> obsah([[[[[(3,7)]]]]])
(5, (3, 7))
>>> obsah(3.14)
(0, 3.14)
>>> obsah([[[1],2]])
(1, None)

instead the outputs are:

(1, 'a')
None
None
(0, 3.14)
None

经过几次测试后,我发现我的临时结果很好但是,使用默认参数(无)递归再次进行,问题出在哪里?不应该以退货结束吗?

2 个答案:

答案 0 :(得分:2)

首先,旁白:

而不是写这个:

for i in range(len(myList)):
    myList[i]

写下这个:

for element in myList:

或者,如有必要:

for i, element in enumerate(myList):

现在,您的代码......

当我们编写递归函数时,我们想要非常明确地讨论两种类型的情况。基本情况和递归情况。我们应该能够在代码中将它们建模为非常明确地

在您的代码中,您真的不会遵循该模型。我无法真正找到基本情况。让我们谈谈基本情况:

  1. 如果传递给递归函数的对象不是list类型,那么我们返回当前深度和传入的对象。
  2. 如果传递给递归函数的列表的长度不是1,那么我们返回当前深度None
  3. 我们的递归情况是递增深度并将myList[0]传递给递归调用。

    所以你的代码应该相当简单:

    def obsah(myList):
        return recursion(myList)
    
    def recursion(myList, depth=0):
        # Base Case
        if type(myList) != list:
            return (depth, myList)
    
        # Another Base Case:
        if len(myList) != 1:
            return (depth, None)
    
        # Iterative case
        return recursion(myList[0], depth+1)
    
    print obsah(['a'])
    print obsah([[123]])
    print obsah([[[[[(3,7)]]]]])
    print obsah(3.14)
    print obsah([[[1],2]])
    

    哪个输出:

    (1, 'a')
    (2, 123)
    (5, (3, 7))
    (0, 3.14)
    (1, None)
    

    记住:

    这里的关键是在开始编写实际代码之前写下基本案例和递归案例

答案 1 :(得分:1)

使用while循环的简单解决方案:

def obsah(nested):
    depth = 0
    while isinstance(nested, list) and len(nested) == 1:
        nested = nested[0]
        depth += 1
    return depth, None if isinstance(nested, list) else nested

print obsah(['a'])
print obsah([[123]])
print obsah([[[[[(3,7)]]]]])
print obsah(3.14)
print obsah([[[1],2]])

打印:

(1, 'a')
(2, 123)
(5, (3, 7))
(0, 3.14)
(1, None)

这个很大的回报纯粹是出于特殊情况,它告诉我,无论是方法还是问题定义,这都是错误的。