2012-05-10 22 views
0

我需要編寫一個遞歸函數dec2base(n, b),它返回正整數n中的基數爲b的數字列表。例如。爲什麼我的遞歸函數錯誤?

dec2base(120, 10) => [1,2,0] (1 * 10**2 + 2 * 10**1 + 0 * 10**0) 

目前我有。

def dec2base(n, b): 
    if n < 10: 
     return [n] 
    else: 
     return dec2base(n, b) + [n%b] 

但是當我運行程序時,它返回一個無限循環錯誤。有任何想法嗎?

+0

添加一些打印語句,看它運行。它會幫助你看到你錯在哪裏。 – sdolan

回答

0

您致電dec2base(n, b)無窮大。如果你打電話

dec2base(20, b) 

你的功能將繼續執行你的if/else語句的第二個分支。您需要將遞減的值傳遞給遞歸函數調用,以便最終n < 10將評估爲True。

+0

我試過n-1但是給出了錯誤的答案。我應該在n上做一個數學風格的東西嗎? – Hoops

+0

做'n // b'。另外,你的if語句沒有任何意義。 'dec2base(10,2)'會產生[5,0],這是不正確的。你想要的是'如果n

+0

非常感謝你! – Hoops

3

你不會在你的方法中的任何點遞減n的值,所以如果你以n> = 10的任何值開始,循環永遠不會結束。

另一種觀察 - 如果b不等於10,則「if n < 10 return [n]」的邏輯似乎沒有意義。例如,9 < 10,但我假設dec2base 9,2)不會[9]。這將是[1,0,0,1]。

2

好的,在任何遞歸函數中,必須有一些函數變爲零才能停下來。在這種情況下,你想要的是you7手工方式做到這一點真的型號:​​

  • 除以基數(基)
  • 把剩餘部分作爲digite
  • 重現使用相同的基地,但該部門的其他部分。 (商。)

也就是說,如果你正在尋找的1000的十六進制值,則採取

dec2base(1000,16):

  • 如果第一參數== 0,返回時,你就大功告成了
  • 1000 MOD 16(= 8) - >保存8
  • dec2base(62,16) - >遞歸步驟

現在,很顯然,每當你進行迴避步驟時,第一個參數就會變小,如果你仔細想想,最終必須變爲0.所以最終它會終止。

這裏是一個真正的簡單版本的Python:

result = "" 

def dec2base(n,b): 
    global result 
    if n <= 0: return 
    result = str(n % b) + result # why am I prepending it? 
    dec2base(n // b, b) 

if __name__ == '__main__': 
    dec2base(1000,8) 
    print result 

現在,如果基礎是什麼> 9(比方說16),你需要從10取轉換值的注意15到的αAF,這是有目的的不是很優雅,因爲我希望它就像例子一樣佈置。

+2

通過修改全局變量傳遞其結果的遞歸函數? *認真*? – Ben

+1

我不確定你如何認爲這是像例子一樣佈置的?對全球變量彈簧的需求從哪裏來? –

+0

是的,因爲它讓我有機會提出關於預先考慮的問題。你不喜歡它,寫你自己的答案。 –

1

解決方案中只有幾個小錯誤。

def dec2base(n, b): 
    if n < b:       # so it will work for bases other than 10 
     return [n] 
    else: 
     return dec2base(n//b, b) + [n%b] # you're just missing "//b" here 

可以稍微簡化像這樣

def dec2base(n, b): 
    if not n: 
     return [] 
    return dec2base(n//b, b) + [n%b] 
相關問題