2016-08-18 84 views
1

我試圖建立一個函數(它使用函數遞歸),掃描一個數字,n,尋找一個數字d,&如果找到,我想用d一個指定的數字r,如下面的代碼所示。此代碼工作正常,但輸出是字符串格式。我嘗試了很多方法來改變它輸出一個整數,但無濟於事。謝謝您的幫助!使用遞歸函數時避免字符串+整數加法

def replace_digit(n, d, r): 
    number = str(n) 
    i = 0 
    if len(number) == 1: 
     if number == str(d): 
      return str(r) 
     else: 
      return number 
    else: 
     if number[i] == str(d): 
      return number[:i] + str(r) + replace_digit(int(number[i+1:]),d,r) 
     else: 
      return number[i] + replace_digit(int(number[i+1:]),d ,r) 
+0

它是一個鍛鍊?換句話說,你是否特別需要使用遞歸?這是一項非常微不足道的任務。 – DeepSpace

+2

只是在返回值中調用'int()' –

+0

是的,我必須專門寫在遞歸中,因此問題。謝謝。 – jaren

回答

0

這是相當簡單,但你需要strint之間的一些類型轉換:

def replace_digit(n, d, r): 
    number = str(n) 
    rest = str(replace_digit(int(number[1:]), d, r)) if len(number) > 1 else "" 
    digit = number[0] 
    digit = str(r) if digit == str(d) else digit 
    return int(digit + rest) 

還有另一種可能,使用的包裝。這限制了類型轉換的數量。

def replace_digit(n, d, r): 
    def replace(n, d, r): 
     rest = replace(n[1:], d, r) if len(n) > 1 else "" 
     return r + rest if n[0] == d else n[0] + rest 

    return int(replace(str(n), str(d), str(r))) 
0

如果你已經有一個工作函數,爲什麼不只是分裂問題?

def replace(n, d, r): 
    def replace_digit(n, d, r): # doesn't change 
     return ... 
    return int(replace_digit(str(n), str(d), str(r)) 
+0

非常感謝!正在接近這樣的解決方案。 :) – jaren

0

的解決方案是爲已經已經評價和其他答案陳述與int()包裹的返回值。

但是,這是一個根本不使用字符串操作的版本。只是爲了好玩。

def replace_digit(n, d, r): 
    rest = n // 10 # all but the rightmost digit 
    digit = n - rest * 10 # only the rightmost digit 
    digit = r if digit == d else digit 
    if rest == 0: 
     return digit 

    return replace_digit(rest, d, r) * 10 + digit 
0

與其將串聯試試這個的:

if number[i] == str(d): 
    new_number = number[:i] + str(r) + replace_digit(int(number[i+1:]),d,r) 
else: 
    new_number = number[i] + replace_digit(int(number[i+1:]),d ,r) 

return int(new_number) 
1
def replace_digit(number, digit, replacement): 

    if number == 0: 
     return number # base case 

    quotient, remainder = divmod(number, 10) 

    if remainder == digit: 
     remainder = replacement 

    return replace_digit(quotient, digit, replacement) * 10 + remainder 


print(replace_digit(961748941982451653, 9, 2)) 

輸出

261748241282451653 
+0

太棒了。我也在考慮純粹基於整數計算的解決方案,但我有這樣的感覺,即OP實際上在理解類型轉換方面掙扎。 – ElmoVanKielmo