如何修复由于Python中的递归函数调用而导致的UnboundLocalError?

苏亚什·谢蒂(Suyash Shetty)

我试图将CLRS算法简介中给出的用于最大子数组问题的伪代码转换为Python中成熟的工作代码。

代码:

def cross(A,low,mid,high):
    left_sum = -float("inf")
    s = 0
    i = mid

    while (i >= low):
        s = s + A[i]
        if s > left_sum:
            left_sum = s
            max_left = i
        i = i - 1

    right_sum = -float("inf")
    s = 0
    j = mid + 1

    while (j < high):
        s = s + A[j]
        if s > right_sum:
            right_sum = s
            max_right = j
        j = j + 1

    return (max_left,max_right,left_sum+right_sum)

def maxSubarray(A,low,high):
    if high == low: return (low,high,A[low])
    else:
        mid = (low+high)/2
        (left_low,left_high,left_sum) = maxSubarray(A,low,mid)
        (right_low,right_high,right_sum) = maxSubarray(A,mid+1,high)
        (cross_low,cross_high,cross_sum) = cross(A,low,mid,high)

        if (left_sum >= right_sum & left_sum >= cross_sum):return (left_low,left_high,left_sum)
        elif (right_sum >= left_sum & right_sum >= cross_sum):return (right_low,right_high,right_sum)
        else: return (cross_low,cross_high,cross_sum)
t = [13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7]

print maxSubarray(t,0,16)

当我尝试运行时,出现此错误。

错误:

Traceback (most recent call last):
  File "/home/suyash/Downloads/python/max_subarray.py", line 64, in <module>
    print maxSubarray(t,0,16)
  File "/home/suyash/Downloads/python/max_subarray.py", line 49, in maxSubarray
    (left_low,left_high,left_sum) = maxSubarray(A,low,mid)
  File "/home/suyash/Downloads/python/max_subarray.py", line 49, in maxSubarray
    (left_low,left_high,left_sum) = maxSubarray(A,low,mid)
  File "/home/suyash/Downloads/python/max_subarray.py", line 49, in maxSubarray
    (left_low,left_high,left_sum) = maxSubarray(A,low,mid)
  File "/home/suyash/Downloads/python/max_subarray.py", line 49, in maxSubarray
    (left_low,left_high,left_sum) = maxSubarray(A,low,mid)
  File "/home/suyash/Downloads/python/max_subarray.py", line 53, in maxSubarray
    (cross_low,cross_high,cross_sum) = cross(A,low,mid,high)
  File "/home/suyash/Downloads/python/max_subarray.py", line 39, in cross
    return (max_left,max_right,left_sum+right_sum)
UnboundLocalError: local variable 'max_right' referenced before assignment

我怎样才能解决这个问题?我哪里出问题了?

艾尔沙德·巴特

两个非常小的错误:

  1. 你的清单t是长度为16,这意味着最后指数是15。因此呼吁maxSubarray(t,0,15)maxSubarray(t,0,16)
  2. while (j <= high)循环直到j<= high直到j<high

同样,通过这两个修复程序,您无需将任何默认值设置为max_rightmax_rightwhile任何if条件语句总是会在每一个递归调用真。

演示:

>>> def cross(A,low,mid,high):
...     left_sum = -float("inf")
...     s = 0
...     i = mid
...     while (i >= low):
...         s = s + A[i]
...         if s > left_sum:
...             left_sum = s
...             max_left = i
...         i = i - 1
...     right_sum = -float("inf")
...     s = 0
...     j = mid + 1
...     while (j <= high):  # Loop until j<= high not until j<high
...         s = s + A[j]
...         if s > right_sum:
...             right_sum = s
...             max_right = j
...         j = j + 1
...     return (max_left,max_right,left_sum+right_sum)
... 
>>> def maxSubarray(A,low,high):
...     if high == low: return (low,high,A[low])
...     else:
...         mid = (low+high)/2
...         (left_low,left_high,left_sum) = maxSubarray(A,low,mid)
...         (right_low,right_high,right_sum) = maxSubarray(A,mid+1,high)
...         (cross_low,cross_high,cross_sum) = cross(A,low,mid,high)
...         if (left_sum >= right_sum & left_sum >= cross_sum):return (left_low,left_high,left_sum)
...         elif (right_sum >= left_sum & right_sum >= cross_sum):return (right_low,right_high,right_sum)
...         else: return (cross_low,cross_high,cross_sum)
... 
>>> t = [13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7]
>>> print maxSubarray(t,0,15)  # Last index = 15 not 16
(7, 10, 43)  # This shows max subarray is from index 7 to 10 i.e., [18,20,-7,12] and the sum is 43

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何修复由于Python中的递归函数调用而导致的UnboundLocalError?

来自分类Dev

Python中的递归函数调用

来自分类Dev

在功能中调用函数时如何修复python中的AttributeError?

来自分类Dev

如何修复递归函数?

来自分类Dev

如何修复C++中错误调用函数导致的逻辑错误

来自分类Dev

在Python中完成递归异步作业后如何调用函数?

来自分类Dev

如何在javascript中调用递归函数

来自分类Dev

python递归函数调用

来自分类Dev

在递归函数中,如何控制函数调用的次数。即递归函数调用自身的次数

来自分类Dev

OOP-Python-如何在类中调用函数并避免由于self引起的参数丢失错误?

来自分类Dev

如何修复由于Pandas Groupby中的级别而导致的索引错误

来自分类Dev

如何查找和修复由于Haskell中的GC而导致的性能问题?

来自分类Dev

如何在递归函数调用中返回当前函数值

来自分类Dev

如何修复php中的递归?

来自分类Dev

如何修复python代码中的“超出最大递归深度”错误?

来自分类Dev

如何在C ++中的类中递归调用函数方法?

来自分类Dev

Python如何在递归函数中求和?

来自分类Dev

如何修复由于远程git repo错误而导致的Jenkins错误

来自分类Dev

如何修复由于移动引导扇区而导致的引导失败?

来自分类Dev

如何递归调用promise函数

来自分类Dev

如何递归调用异步函数?

来自分类Dev

修复由于iOS 7中的UIRefreshControl而导致的UITableViewController偏移

来自分类Dev

递归调用类中的函数

来自分类Dev

在AngularJS中递归调用函数

来自分类Dev

调用另一个函数中的一个函数会由于括号中的参数而导致错误

来自分类Dev

Python模拟:如何测试递归函数的调用次数?

来自分类Dev

如何在链表中对析构函数进行递归调用?

来自分类Dev

如何在C ++中调用递归链表遍历函数

来自分类Dev

如何在Elixir中调用递归函数并行

Related 相关文章

  1. 1

    如何修复由于Python中的递归函数调用而导致的UnboundLocalError?

  2. 2

    Python中的递归函数调用

  3. 3

    在功能中调用函数时如何修复python中的AttributeError?

  4. 4

    如何修复递归函数?

  5. 5

    如何修复C++中错误调用函数导致的逻辑错误

  6. 6

    在Python中完成递归异步作业后如何调用函数?

  7. 7

    如何在javascript中调用递归函数

  8. 8

    python递归函数调用

  9. 9

    在递归函数中,如何控制函数调用的次数。即递归函数调用自身的次数

  10. 10

    OOP-Python-如何在类中调用函数并避免由于self引起的参数丢失错误?

  11. 11

    如何修复由于Pandas Groupby中的级别而导致的索引错误

  12. 12

    如何查找和修复由于Haskell中的GC而导致的性能问题?

  13. 13

    如何在递归函数调用中返回当前函数值

  14. 14

    如何修复php中的递归?

  15. 15

    如何修复python代码中的“超出最大递归深度”错误?

  16. 16

    如何在C ++中的类中递归调用函数方法?

  17. 17

    Python如何在递归函数中求和?

  18. 18

    如何修复由于远程git repo错误而导致的Jenkins错误

  19. 19

    如何修复由于移动引导扇区而导致的引导失败?

  20. 20

    如何递归调用promise函数

  21. 21

    如何递归调用异步函数?

  22. 22

    修复由于iOS 7中的UIRefreshControl而导致的UITableViewController偏移

  23. 23

    递归调用类中的函数

  24. 24

    在AngularJS中递归调用函数

  25. 25

    调用另一个函数中的一个函数会由于括号中的参数而导致错误

  26. 26

    Python模拟:如何测试递归函数的调用次数?

  27. 27

    如何在链表中对析构函数进行递归调用?

  28. 28

    如何在C ++中调用递归链表遍历函数

  29. 29

    如何在Elixir中调用递归函数并行

热门标签

归档