2016-08-18 8 views
1

数字dを検索するためにnをスキャンする関数(関数再帰を使用する)を作成しようとしていますが、見つかった場合は&を置き換えます。以下のコードに示すように、指定された数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) 

別のpossiblityがラッパーを使用して、もあります。これは型変換の数を制限します。

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)) 

OUTPUT

261748241282451653 
+0

恐ろしい。純粋に整数計算に基づいたソリューションについても考えていましたが、OPが実際に型変換を理解するのに苦労していると感じました。 – ElmoVanKielmo