【问题标题】:using recursion to find the integer appearing odd times使用递归查找出现奇数次的整数
【发布时间】:2020-01-15 14:37:49
【问题描述】:

我正在寻找以下代码的指导。我正在学习 Python,我来自 Java 和 C#,我是初学者。我想编写一个函数,它返回出现奇数次的数字。假设数组总是大于 1,并且总是只有一个整数出现奇数次。我想使用递归。

该函数不返回值,因为当我存储结果时我得到一个 NoneType。拜托,我不是在寻找解决方案,而是在寻找调试时的位置和思考方式的一些建议。

def find_it(seq):
    seqSort = seq
    seqSort.sort()
    def recurfinder(arg,start,end):
        seqSort = arg
        start = 0
        end = seqSort.length()-1
            for i in range(start,end):
                counter = 1
                pos = 0
            if seqSort[i+1] == seqSort[i]:
                counter+=1
                pos = counter -1
            else:
                if(counter % 2 == 0):
                    recurfinder(seqSort, pos+1, end)
                else:
                    return seqSort[i]
        return -1

【问题讨论】:

  • 请格式化您的代码
  • 对于所有与 python 相关的问题,请始终使用通用 [python] 标签。自行决定使用特定于版本的标签。请注意,通常假定 Python 3 是因为 Python 2 正迅速接近其生命周期的终点。
  • 理解,抱歉,谢谢

标签: python recursion range


【解决方案1】:

您实际上需要从recurFinder 之外的某个地方调用recurFinder 才能让事情顺利进行。

【讨论】:

  • 使用字典会简单很多;也更快。
【解决方案2】:
def getOddOccurrence(arr, arr_size): 

    for i in range(0, arr_size): 
        count = 0
        for j in range(0, arr_size): 
            if arr[i] == arr[j]: 
                count+= 1

        if (count % 2 != 0): 
            return arr[i] 

    return -1

arr = [2, 3, 5, 4, 5, 2, 4, 3, 5, 2, 4, 4, 2 ] 
n = len(arr) 
print(getOddOccurrence(arr, n))

【讨论】:

  • 请注意,此实现对大小为N 的数组执行 步骤。因此,虽然它适用于小型阵列,但它会很快变慢。
【解决方案3】:

此答案使用递归和 dict 进行快速计数器查找 -

def find_it(a = [], i = 0, d = {}):
  if i >= len(a):
    return [ n for (n, count) in d.items() if count % 2 == 1 ]
  else:
    d = d.copy()
    d[a[i]] = d.get(a[i], 0) + 1
    return find_it(a, i + 1, d)

它是这样工作的 -

print(find_it([ 1, 2, 2, 2, 3, 3, 4, 5, 5, 5, 5 ]))
# [ 1, 2, 4 ]

print(find_it([ 1, 2, 3 ]))
# [ 1, 2, 3 ]

print(find_it([ 1, 1, 2, 2, 3, 3 ]))
# []

print(find_it([]))
# []

id 以上在调用点暴露。此外,因为我们依赖 Python 的默认参数,所以我们必须调用 d.copy() 以避免变异 d。使用内部 loop 可以缓解这两个问题 -

def find_it(a = []):
  def loop(i, d):
    if i >= len(a):
      return [ n for (n, count) in d.items() if count % 2 == 1 ]
    else:
      d = d.copy()
      d[a[i]] = d.get(a[i], 0) + 1
      return loop(i + 1, d)
  return loop(0, {})

它的工作原理与上面相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-28
    • 2020-04-30
    • 2017-09-13
    • 2023-03-19
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    相关资源
    最近更新 更多