Python中的递归函数引发错误

时间:2019-06-22 16:58:16

标签: python recursion

试图做这个问题,我在python上的leetcode.com上找到了

给出n个元素的排序(按升序排列)整数数组num和目标值,编写一个函数以num搜索目标。如果目标存在,则返回其索引,否则返回-1。

示例1:

输入:nums = [-1,0,3,5,9,12],目标= 9 输出4 说明:9以数字形式存在,其索引为4

示例2:

输入:nums = [-1,0,3,5,9,12],目标= 2 输出:-1 说明:2不存在数字,因此返回-1

注意:

  1. 您可以假设num中的所有元素都是唯一的。
  2. n的范围为[1,10000]。
  3. 每个元素的值(以num为单位)将在[-9999,9999]范围内。

第一次尝试

class Solution(object):
    count = 0;
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        if (nums[count] == target):
            return count;
        elif(count +1 >len(nums)):
            return -1;
        else:
            count += 1;
            return search(self, nums, target);

我的第二次尝试是相同的确切代码,除了以下行: 计数= 0; 被放在函数定义之后: def搜索(自我,数字,目标):

输入:

nums = [-1,0,3,5,9,12] 目标= 9

预期答案:4

(第一次尝试)实际答案: 第10行:UnboundLocalError:赋值之前引用了本地变量'count'

(第二次尝试)实际答案: 第16行:NameError:未定义全局名称“搜索”

我在网上使用python查找了递归函数,但由于所有示例代码或多或少都是相同的,因此它并没有提供太多帮助。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

您的问题与递归无关,而与滥用类成员有关。

UnboundLocalError: local variable 'count' referenced before assignment意味着您使用return countcount += 1,但从未将其初始化为任何东西。大概是您想在方法正文中进行count = 0,还是使用self.count

NameError: global name 'search' is not defined是因为您在错误地调用类方法。 self在类方法上是特殊的,因此请执行search(self, nums, target)而不是self.search(nums, target)

答案 1 :(得分:0)

您需要使用self.search,而且我认为还有一种更好的方法可以解决问题

该问题基本上与二进制搜索有关。您可以通过以下https://www.geeksforgeeks.org/binary-search/

了解更多信息

我还将附加Python中的代码以及测试数据以供参考。希望对您有帮助

def binarySearch (nums, left, right, target):
if right >= left:
    mid = left + (right - left)/2
    if nums[mid] == target: 
        return mid 
    elif nums[mid] > target: 
        return binarySearch(nums, left, mid-1, target) 
    else: 
        return binarySearch(nums, mid + 1, right, target) 
else: 
    return -1

nums = [-1,0,3,5,9,12]
target = 9
result = binarySearch(nums, 0, len(nums)-1, target) 
print result