2015-11-02 42 views
1

我必須編寫一個遞歸函數,該函數在10個基數中獲取數字(n)並將其轉換爲給定數字基數(k)並返回一個列表,其組成部分是最終列表例如f(5, 3)必須導致[1, 2]其中基數3中的5是12,或者f(22, 3)必須導致[2, 1, 1]將某個數字的基數更改爲給定數字

這是我試過的代碼:

def cb(n, k): 
    b = [] 
    if n == 0: 
     b.append(0) 
    if n < k: 
     b.append(n) 
    if n == k: 
     b.append(10) 
    else: 
     a = n // k 
     b.append(n - ((n // k) * k)) 
     if a < k: 
      b.append(a) 
     else: 
      cb(a, k) 

    return b 

print(cb(22, 3)) 

其實我想了很多,但因爲我不是那麼好。在寫代碼我不能再往前走。感謝您對我的代碼的幫助和修改。

+0

它工作嗎?你怎麼知道的?它的工作價值是什麼? –

+0

nope我的代碼不起作用,實際上我無法做出另一種方式... –

+0

else:cb(a,k)'做什麼? –

回答

7

情況是當n < k的答案是n,並得到n的最後一位數你做n%k所以recograive案件是cb(n//k,k)+[n%k]

的代碼看起來就像這樣:

def cb(n, k): 
    if n < k: 
     return [n] 
    else: 
     return cb(n//k, k) + [n%k] 

print(cb(22, 3)) 
2

你是非常接近的,你需要做的是改變的唯一的事:

else: 
     cb(a, k) 

到:

else: 
     b.extend(cb(a, k)) 

然而,你的輸出將是:

>>> cb(22, 3) 
[1, 1, 2] 

這與你想要的相反,因爲基數3中的22是211。您可以通過扭轉名單[1,1,2][::-1] == [2,1,1]解決這個問題或更換,以append所有來電和extend新的呼叫,而不是在列表一樣的開頭添加:如果你想在遞歸基礎方面b.insert(0,element)b = cb(a,k) + b

1

最大的問題是,你是不是做與遞歸調用的結果任何事情,所以他們從來沒有在列表中去。我認爲你也太複雜了。像這樣的東西應該工作:

def cb(n,k): 
    if n > 0: 
    q = n // k 
    r = n - q * k 
    b = cb(q, k) 
    b.append(r) 
    else: 
    b = [0] 

    if b[0] == 0 and len(b) > 1: 
    b = b[1:] 

    return b 

我認爲如果你不做最後一部分,那麼你總是得到0前面?您還可以通過測試它是否小於基數來進一步簡化它,從而得到更簡單的解決方案

def cb(n,k): 
    if n < k: 
    return [n] 
    else: 
    q = n // k 
    r = n - q * k 
    b = cb(q, k) 
    b.append(r) 
    return b