2016-10-14 74 views
-1

我創建了兩個函數,一個返回基數爲10的三進製表示,另一個用遞歸返回三元數的基數爲10的表示。例如52會返回1221.現在,我有這個下來,但我不知道如何做到這一點。我主要與三元表示方面的2方面以及如何將其實現爲代碼相混淆。Python三元算法

def numToTernary(n): 
'''Precondition: integer argument is non-negative. 
    Returns the string with the ternary representation of non-negative integer 
    n. If n is 0, the empty string is returned.''' 
    if n==0: 
     return '' 
    if n<3: 
     return str(n) 
    return numToTernary(n//3)+ 
+0

。你也可以在代碼中檢查'if n <0',而不是將它作爲文檔字符串的一部分 – UnholySheep

回答

0

因此,所有鹼基變化的大的想法是這樣的:

你把寫在base b因爲這123這意味着在nbase 10等於1*b² + 2*b + 3一個number n。所以從base bbase 10的轉換是直截了當的:你把所有的數字都乘以基數,並以正確的權重乘以它們。

現在進行相反的操作:您在base 10中有number n,並且想要將其打開爲base b。該操作只是計算新基地中的每個數字。 (我假設我的結果只有三位數爲下面的例子)因此,我正在尋找d2,d1,d0在n的base b的數字。我知道d2*b² + d1*b + d0 = n。這意味着(d2*b + d1)*b + d0 = n,所以我們認識到一個歐幾里德分裂的結果,其中d0是n的歐幾里德除法的餘數乘以d:d0=n%d。我們已經將d0標識爲餘數,所以括號中的表達式爲quotien q,q=n//b,所以我們有一個新的方程來解決使用完全相同的方法(因此遞歸)d2*b + d1 = q

和所有的翻譯給你幾乎擁有的代碼:我不知道實際的問題是什麼

def numToTernary(n): 
    '''Precondition: integer argument is non-negative. 
    Returns the string with the ternary representation of non-negative integer 
    n. If n is 0, the empty string is returned.''' 
    if n==0: 
     return '' 
    if n<3: 
     return str(n) 
    return numToTernary(n//3)+str(n%3) 

print(numToTernary(10)) 
Out[1]: '101' 
0

你幾乎在那裏與你的代碼。根據this question,這應該可以做到這一點。

但是,您必須在此函數之外搜索「0」:因爲它已在您的代碼中完成,所以在輸出中不會跳過「0」數字,並且應輸出「120011 「例如將會輸出」1211「。

def numToTernary(n): 
    '''Precondition: integer argument is non-negative. 
    Returns the string with the ternary representation of non-negative integer 
    n. If n is 0, the empty string is returned.''' 
    if n<3: 
     return str(n) 
    return numToTernary(n//3)+str(n%3)