【问题标题】:My divide and conquer algorithm works, but my code isn't returning a value我的分治算法有效,但我的代码没有返回值
【发布时间】:2014-03-02 12:13:48
【问题描述】:

所以我正在尝试学习以正确的方式编写代码,并且正在阅读一本算法和数据结构的书。作为向读者传授算法价值的练习的一部分(在我们开始学习算法之前),我正在解决一个编码练习问题,该问题将在 O(N) 时间内找到整数列表中的第 k 个最小整数。我避免寻找答案,因为我想自己解决它以进行大脑锻炼。无论如何,我的代码主要使用公认的笨拙的分而治之算法。
我不想对算法本身有任何帮助!!我只想知道我做错了什么,因为我可以打印输出,但返回它不起作用。

alg_list = [7, 10, 18, 3, 8, 11, 9, 15, 0, 14, 12, 16, 6, 5, 2, 13, 17, 4, 1, 19]

def kth_smallest(k, input_list):
  N = len(input_list)
  if N == k:
    input_list.sort()
    M = input_list[-1]
    print M  # used this to get some output to ensure the algorithm works at least
    return M #this is where Im confused.  Why no return?
  else:
    if N == 1:
        M = input_list[0]
        #print '2nd condition'
        return M
    elif N%2 == 0:
        M = input_list[N/2]
        #print '3rd condition'
    else:
        M = input_list[(N - 1)/2]
        #print '4th'
    list_small = [x for x in input_list if x < M]
    list_large = [x for x in input_list if x > M]
    if len(list_small) == k - 1:
        #print '5th'
        return M
    elif len(list_small) > k - 1:
        #print '6th'
        kth_smallest(k, list_small)
    elif (len(list_large) + len(list_small)) == (k - 1):
        #print '7th'
        return M
    elif (len(list_large) + len(list_small)) == k:
        #print '8th'
        new_list = list_large + list_small
        kth_smallest(k, new_list)
    else:
        #print '9th'
        kth_smallest(k, list_large)

kth_smallest(3, alg_list)

在这里打印3,但是如果我注释掉打印语句,它不会返回3。我在这里返回值“M”做错了什么??同样,我确信我在算法上的糟糕尝试很糟糕,但我在本书的开头,这个练习只是为了让读者思考,所以我现在可以接受它很糟糕。我只想知道我在返回值时做错了什么。我假设我错过了一些非常明显的东西。

谢谢!!

【问题讨论】:

  • 只有少数几个分支可以退回任何东西。仔细检查你的递归​​调用,看看你是否应该把return放在它们前面。我认为你应该这样做。
  • 谢谢!这非常有帮助。让我吃惊的是,我的大脑竟然会因为这样的微妙细节而变得愚蠢!
  • 那个算法不是O(n),顺便说一句……重点是避免排序
  • 你也删除了等于M的元素
  • 谢谢尼克拉斯。你是对的,我放弃了 M。我将不得不调整。也意识到需要摆脱排序。

标签: python algorithm


【解决方案1】:

在函数kth_smallest内部,在每次调用kth_smallest的左侧添加return

然后,在这个函数之外,改变:

kth_smallest(3, alg_list)

收件人:

val = kth_smallest(3, alg_list)
print val

或者简单地说:

print kth_smallest(3, alg_list)

【讨论】:

  • 谢谢!正如我上面所说,我经常为我的一些疏忽是多么愚蠢而感到谦卑。这里有这么多优秀人才的资源真的很有帮助。
猜你喜欢
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多