了解递归中的实例

时间:2014-01-27 14:21:05

标签: python recursion python-3.x isinstance

所以基本上我无法理解这两个概念。我用谷歌搜索了2天并玩弄了2个为我自己创造了某种图片,但它仍然像我并不真正了解一切。 根据我的理解,如果你需要处理多级列表,isinstance被用作递归的基础,它会返回true或false,具体取决于元素是什么?属于所述类型。 事情是我知道它的定义,但我根本无法理解它是如何真正起作用才能真正使用它。我以为我会提供一个示例代码,也许你们中的一些人可以详细解释这个函数在每个细节中是如何工作的。这是:

def first_and_last(a):
    if not (isinstance(a,list)):
        return a
    elif a == []:
        return []
    else:
        return [first_and_last(a[0]), first_and_last(a[-1])]


print(first_and_last([[1, 2, 3, [3, 3, 4, 5]], 6, 7, 7]))

基本上代码是老师共享的代码,但代码的想法是返回列表中每个级别的第一个和最后一个元素。

2 个答案:

答案 0 :(得分:3)

只需在此处绘制递归:

first_and_last([[1, 2, 3, [3, 3, 4, 5]], 6, 7, 7])
   a is a list and not equal to []
   first_and_last([1, 2, 3, [3, 3, 4, 5]])
       a is a list and not equal to []
       first_and_last(1)
           a is not a list
           return 1
       first_and_last([3, 3, 4, 5])
           a is a list and not equal to []
           first_and_last(3)
               a is not a list
               return 3
           first_and_last(5)
               a is not a list
               return 5
           return [3, 5]
       return [1, [3, 5]]
   first_and_last(7)
       a is not a list
       return 7
   return [[1, [3, 5]], 7]

因此,isinstance()仅用于查找在该调用中传入的值何时不是列表,以终止递归调用树。

答案 1 :(得分:0)

isinstance用于打开和关闭first_and_last,因为您可以深入了解嵌套列表。考虑前几个呼叫:在第一个呼叫a[0]中是列表:[1,2,3[3,3,4,5]],但在下一个呼叫中,a[0]是一个整数1。您不能嵌套到整数中,isinstance是检测到您已达到“列表列表列表...”层次结构中“原始”列表元素级别的条件。由于您始终访问列表的第一个(a[0])或最后一个(a[-1])元素,因此它不是列表意味着它是您要返回的内容(第一个或最后一个元素)列表,只要它不是内部列表。)

第二个条件是防止在空列表中调用a[0]a[-1]。如果输入参数中包含空列表,则只会立即返回它,而不会尝试处理其不存在的元素。