#python #recursion #nameerror
#python #рекурсия #ошибка имени
Вопрос:
У меня есть рекурсивная функция, которая вычисляет некоторый ответ в конце, и я должен сохранить максимум этих временных ответов и вернуть его.
Код выглядит следующим образом.
(Если вы это знаете, я не беспокоюсь об алгоритме Кадане, я хотел знать, как это сделать)
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
ans = nums[0]
def helper(n):
global ans
if(n == 1):
return nums[0]
temp = max(nums[n-1], nums[n-1] helper(n-1))
ans = max(ans, temp) ### how do I do this? ###
return temp
helper(len(nums))
return ans
Ошибка, которую я получаю,:
NameError: name 'ans' is not defined
Как мне сохранить максимальное значение и вернуть его в таких случаях? Поскольку это не работает.
Комментарии:
1. Потому
ans
что при первой попытке ее использования глобального значения нет
Ответ №1:
Это идеальный вариант использования для nonlocal
ключевого слова! Это ключевое слово позволяет ссылаться на ans
переменную во включающей функции.
Решение (просто заменить global
на nonlocal
):
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
ans = nums[0]
def helper(n):
nonlocal ans
if(n == 1):
return nums[0]
temp = max(nums[n-1], nums[n-1] helper(n-1))
ans = max(ans, temp) ### how do I do this? ###
return temp
helper(len(nums))
return ans
Комментарии:
1. «Это ключевое слово позволяет ссылаться на переменную ans во включающей функции». Это позволяет вам присваивать ей, вы всегда можете просто ссылаться на нее. Но да, это намного лучше, чем использование глобальной переменной
Ответ №2:
вы должны добавить global ans
дважды в первой функции и во второй. с вашим кодом:
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
global ans
ans = nums[0]
def helper(n):
global ans
if(n == 1):
return nums[0]
temp = max(nums[n-1], nums[n-1] helper(n-1))
ans = max(ans, temp) ### how do I do this? ###
return temp
helper(len(nums))
return ans
Ответ №3:
Вам нужно объявить глобальную в той же функции, что и само объявление переменной, потому что прямо сейчас вы пытаетесь установить глобальную для переменной, которая находится за пределами области видимости вложенной функции.
Следующий код должен работать:
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
global ans
ans = nums[0]
def helper(n):
global ans
if(n == 1):
return nums[0]
temp = max(nums[n-1], nums[n-1] helper(n-1))
ans = max(ans, temp) ### how do I do this? ###
return temp
helper(len(nums))
return and
имейте в виду, что вы должны указывать global ans
не только при определении переменной, но и в каждой функции, которую вы хотите присвоить переменной.