iT邦幫忙

0

為什麼求LCS(最大共同子序列)會跑出NoneType

  • 分享至 

  • xImage

https://ithelp.ithome.com.tw/upload/images/20220714/201505272p8R73J1Su.jpg

def C1(i, j):
    x = " " + i_word
    y = " " + j_word
    
    if i == 0 or j == 0:
        return 0
    elif (i > 0 and j > 0) and x[i] == y[j]:
        return C1(i-1, j-1) + 1
    elif (i > 0 and j > 0) and x[i] != y[j]:
        print(i, j)
        return max(C1(i-1, j), C1(i, j-1))

def C2(i, j, k):
    x = " " + i_word
    y = " " + j_word
    z = " " + k_word
    
    if i == 0 or j == 0 or k == 0:
        return 0
    elif (i > 0 and j > 0 and k > 0) and x[i] == y[j] == z[k]:
        return C2(i-1, j-1, k-1) + 1
    elif (i > 0 and j > 0 and k > 0) and x[i] != y[j] != z[k]:
        return max(C2(i-1, j, k), C2(i, j-1, k), C2(i, j, k-1))

我試著用這樣的方法寫出了求兩個字串和求三個字串LCS的程式碼,兩個字串的可以正常運行,但不知道為什麼三個字串的會回傳出None來,希望各位可以為小弟解答 /images/emoticon/emoticon04.gif

看更多先前的討論...收起先前的討論...
mia iT邦新手 5 級 ‧ 2022-08-03 15:04:19 檢舉
x[i] != y[j] != z[k] 之間應該是 or 的關係(參考海綿寶寶附的連結內容),

試試看改成
x[i] != y[j] or y[j] != z[k] or x[i] != z[k]
mia iT邦新手 5 級 ‧ 2022-08-03 15:20:09 檢舉
我解釋一下為什麼會回傳 None

假設
i_word = "123"
j_word = "123"
k_word = "153"

執行你的程式碼, 先比較最後一個字串
"3" == "3" == "3", 執行 return C2(i-1, j-1, k-1) + 1

這時候 , 比較第二個字 "2" 與 "2" 與 "5"
你期望是執行 elif x[i] != y[j] != z[k] 裡面的 max
程式碼因為 "2" != "2" 不成立, 所以不會執行 max 這行
回傳 None
導致 None + 1 出錯
undyneun iT邦新手 5 級 ‧ 2022-08-03 16:09:26 檢舉
有用欸 我當時是直接照著公式寫程式碼沒有注意到會這樣 謝謝!!
mia iT邦新手 5 級 ‧ 2022-08-03 17:08:50 檢舉
回傳結果為 None 有懂嗎? 如果我寫的不清楚在問吧, 我在另外截圖說明給你
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
海綿寶寶
iT邦大神 1 級 ‧ 2022-07-15 09:34:36
最佳解答

要解三字串的 LCS
可參考這篇

若想找出你程式的問題
請貼出完整的程式碼文字
不要讓網友要重新打字一遍
https://ithelp.ithome.com.tw/upload/images/20220715/2000178793gyWi2KQJ.png

undyneun iT邦新手 5 級 ‧ 2022-07-16 11:20:04 檢舉

謝謝 第一次發問 現在知道可以這樣了!

/images/emoticon/emoticon12.gif

我要發表回答

立即登入回答