2015-06-22 283 views
0

我試圖解決一個難題,即反向工程這個代碼,得到一個可能的密碼列表,並從那裏應該有一個'脫穎而出',並應該工作Python遞歸函數不遞歸

function checkPass(password) { 
    var total = 0; 
    var charlist = "abcdefghijklmnopqrstuvwxyz"; 
    for (var i = 0; i < password.length; i++) { 
     var countone = password.charAt(i); 
     var counttwo = (charlist.indexOf(countone)); 
     counttwo++; 
     total *= 17; 
     total += counttwo; 
    } 
    if (total == 248410397744610) { 
     //success// 
    } else {... 

我的蟒蛇,我認爲應該工作寫的東西,我反向工程,其中它增加和乘法,並且有它嘗試每個字符,看它是否正確劃分爲偶數的順序。

from random import shuffle 

def shuffle_string(word): 
    word = list(word) 
    shuffle(word) 
    return ''.join(word) 

charlist = "abcdefghijklmnopqrstuvwxyz" 
total = 248410397744610 
temp = total 
password = '' 
runtime = 20 

def runlist(): 
    global charlist 
    global total 
    global temp 
    global password 
    global runtime 
    for i in range(25): 
     if (temp - (i+1)) % 17 == 0: 
      password += charlist[i] 
      temp -= i+1 
      temp = temp /17 

    if temp == 0: 
     print password 
     password = '' 
     temp = total 
     runtime += 1 
     charlist = shuffle_string(charlist) 
     if runtime < 21: 
      runlist() 
    else: 
     runlist() 

但是當我嘗試運行它,我只得到

deisx 

Process finished with exit code 0 

我不知道爲什麼我的功能不正常遞歸,因爲它看起來像它應該從我所看到的。嘗試自己運行,看看會發生什麼。

這個謎題應該有多種解決方案(我認爲?),並且我計劃讓它能夠重複,直到它獲得所有解決方案,但是我爲什麼只是貫穿每個字母都有點失落,然後死亡。

編輯: 修改後的代碼實際上遞歸,但現在我沒有得到任何輸出,並且還退出碼0結束

編輯2:再次 修改後的代碼來修復錯誤

+2

你的函數實際上並沒有遞歸 - 它無處自稱。 – nneonneo

+0

在Python中,縮進是語法的一部分。遞歸調用在函數體外部, –

+1

'if temp> 0:'的部分沒有縮進,這是故意的還是在您編輯問題時錯誤地滑動了? – alfasin

回答

0

怕我不太瞭解python,但我可以幫你算一下。

編碼處理重複以下:

  • 乘以當前總通過17
  • 用於下一字母添加的值(A = 1,B = 2,...,Z = 26)到 總數

所以在任何時候,總數都是17的倍數加上最後一個字母的值。因此,遞歸求解器中的每一步必須刪除最後一個字母,然後將結果除以17.

但是,因爲乘數爲17,並且字母表中有26個字符,所以某些餘數值可能會超過一封信 - 這是許多密碼可能導致相同的解決方案。

例如:

  • 編碼 「一」 給出了一個總的1和1%17 = 1
  • 編碼 「R」 給出總共18個,和18%17 = 1

所以如果當前餘數是1,那麼編碼的字母可能是「a」或「r」。我認爲在您的解決方案中,您只會查找這些案例中的第一個,而錯過第二個案例。

在僞代碼,我的功能來解決,這將是這個樣子:

function decodePassword(total, password) 
    if total == 0 
     print password 
     return 
    end if 

    var rem = total/17  # integer division - truncate 
    var char1 = total % 17  # potential first character 
    var char2 = char1 + 17  # potential second character 

    # char1 values 1-16 map to letters a-p 
    if char1 >= 1 
     decodePassword(rem, charlist.charAt(char1 - 1) + password) 
    end if 

    # char2 values 17-26 map to letters q-z 
    if rem > 0 && char2 <= 26 
     decodePassword(rem - 1, charlist.charAt(char2 - 1) + password) 
    end if 

end function 

如果有幫助,你正在尋找的答案是12個字符長,而且很可能在這個論壇不是見諸報端

HTH

+0

謝謝!這很有幫助,你的解釋幫助我以一種更有意義的方式思考問題。 –

0

你的代碼既不是重複也不遞歸因爲:

  1. runlist功能只調用一次
  2. runlist功能不適合遞歸的模式是:
    • 檢查的處理結束的條件,如果滿足回報最終結果
    • 否則返回迄今爲止的結果加上調用youself