簡體   English   中英

Python遞歸輔助方法返回none而不是int

[英]Python recursive helper method returns none instead of int

我想編寫代碼,以便我可以使用快速排序找到第 k 個最大的數字,並在 LeetCode 中編寫以下代碼,LeetCode 將首先調用 findKthLargest

class Solution(object):
    def partition(self, arr,left,right):
        piv = arr[right]
        i = left-1
        counter = left
        while (counter<right):
            if (arr[counter]<piv):
               i = i+1
               tmp = arr[counter] 
               arr[counter]=arr[i]
               arr[i]=tmp
            counter = counter+1
        temp = arr[i+1]
        arr[i+1]=arr[right]
        print('pivot '+str(piv)+' at '+str(i+1))
        arr[right]=temp
        print("at the nmoment "+str(arr))
        return (i+1)
    def helper(self,arr,left,right,k):
        if (left>=right):
            return 
        p = self.partition(arr,left,right)
        print("p is now "+str(p))
        if (p==len(arr)-k):
  
            return int(arr[p])
        self.helper(arr,left,p-1,k)
        self.helper(arr,p+1,right,k)
    def findKthLargest(self, nums, k):
        f= self.helper(nums,0,len(nums)-1,k)
        print(f)

我什至在 helper 方法中打印了 (arr[p]) ,它給了我正確的答案,但是在 findKthLargest 方法內部,變量 f 顯示為 none 類型,我想知道我哪里出錯了? 目前我相信它返回的是 none 類型,因為在遞歸循環內部檢查輔助方法內部是否 (left>=right) 時它返回 none

問題是你的helper函數並不總是返回一個值。 只有在if條件為真的基本情況下,它才會返回一個數值。 但它也應該在進行相應的遞歸調用時返回相同的數字。

所以改變:

self.helper(arr,left,p-1,k)
self.helper(arr,p+1,right,k)

到:

result = self.helper(arr,left,p-1,k)
if result is not None:
    return result
return self.helper(arr,p+1,right,k)

這樣,最深的返回值將使遞歸樹冒泡,並且第一次遞歸調用成功將避免進行第二次遞歸調用。

很難調試你的代碼,這會通過較少的語句:

class Solution:
    def findKthLargest(self, nums, k):
        def kth_smallest(nums, k):
            if nums:
                pos = partition(nums, 0, len(nums) - 1)
                if k > pos + 1:
                    return kth_smallest(nums[pos + 1:], k - pos - 1)
                elif k < pos + 1:
                    return kth_smallest(nums[:pos], k)
                else:
                    return nums[pos]

        def partition(nums, left, right):
            res = left
            while left < right:
                if nums[left] < nums[right]:
                    nums[left], nums[res] = nums[res], nums[left]
                    res += 1
                left += 1
            nums[res], nums[right] = nums[right],  nums[res]
            return res

        return kth_smallest(nums, len(nums) + 1 - k)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM