Rumah  >  Soal Jawab  >  teks badan

python - 为何在这种情况下max()函数不能使用?

class LongestIncreasingSubsequence:
    def getLIS(self, A, n):
        # write code here
        dp=[0 for i in range(n)]
        dp[0]=1
        max=0
        print dp
        for i in range(n):
            now=0
            if i!=0:
                res=1
                for j in range(i):
                    if A[i]>A[j]:
                        res=dp[j]
                        now=now +1
                if now>=max:
                    max=now
                    dp[i]=res+1
                else:
                    dp[i]=res
        print dp
        #return max(dp)

kk=LongestIncreasingSubsequence()
kk.getLIS([1,4,2,5,3],5)

其中dp 是一个以int类型为成员的list
而使用max()函数时却会报错
TypeError: 'int' object is not callable
是由什么原因导致的?

怪我咯怪我咯2741 hari yang lalu1054

membalas semua(2)saya akan balas

  • PHPz

    PHPz2017-04-18 09:24:28

    Fungsi maks anda diberi nilai 0 dalam baris kelima

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:24:28

    Sebabnya seperti yang @rayleisure katakan, anda menggunakan max di sini sebagai rujukan kepada pembolehubah jenis int, menghasilkan

    return max(dp)

    bukan sahaja menyebabkan fungsi bina dalam gagal, tetapi juga menyebabkan:

    TypeError: 'int' object is not callable

    Ini kerana anda membuat panggilan ke integer max,

    Ringkasnya, ingatlah untuk tidak menamakan pembolehubah dengan:

    1. kata kunci

    2. fungsi terbina dalam

    3. Nama pustaka standard atau mana-mana pakej/modul yang sedang digunakan

    Nama yang sama.

    Penyimpangan

    Yang berikut adalah di luar topik

    1. Berdasarkan kod semasa anda, nampaknya anda hanya perlu menulis fungsi menulis kelas ini nampaknya berlebihan (melainkan anda melakukan bank soalan dalam talian?)

    2. Tidak perlu secara khusus melepasi panjang senarai Bertanya tentang panjang senarai dalam Python boleh dilakukan dengan mudah dengan len()

    3. Untuk masalah LIS, saya memudahkan kod anda:

    Hanya cari panjang LIS:

    def lislength(lst):
        """O(n^2) by button-up method"""
        n = len(lst)
        dp = [1 for x in lst]
        for i in range(n):
            for j in range(i+1, n):
                if lst[j] > lst[i]:
                    dp[j] = max(dp[j], dp[i]+1)
        return max(dp)

    Seluruh LIS menuntut ia keluar:

    def lis(lst):
        """O(n^2) by button-up method"""
        # use prev to record the previous elements
        n = len(lst)
        dp = [1 for x in lst]
        prev = [-1 for x in lst]
        for i in range(n):
            for j in range(i+1, n):
                if lst[j] > lst[i]:
                    if dp[i]+1 > dp[j]:
                        prev[j] = i
                        dp[j] = dp[i]+1
        # find last elements of LIS
        maxl = maxpos = 0
        for pos, l in enumerate(dp):
            if l > maxl:
                maxl, maxpos = l, pos
        # trace back to find LIS
        seq = []
        while maxpos >= 0:
            seq.append(lst[maxpos])
            maxpos = prev[maxpos]
        seq.reverse()
        return seq

    Ujian:

    print(lislength([4,5,6,7,1,2,3,9]))
    print(lis([4,5,6,7,1,2,3,9]))
    print(lislength([1,3,6,7,4,5,9,10,15,12,14]))
    print(lis([1,3,6,7,4,5,9,10,15,12,14]))

    Keputusan:

    5
    [4, 5, 6, 7, 9]
    8
    [1, 3, 6, 7, 9, 10, 12, 14]

    Soalan yang saya jawab: Python-QA

    balas
    0
  • Batalbalas