ILoveMath:
def digital_root(n):
x = str(n)
while len(x)!=0 and len(x)!=1:
r = 0
for i in range(len(x)):
r= r + int(x[i])
x = str(r)
return r
デジタルルートの数はすべての桁の再帰的な和です。Nを考えると、n個の数字の合計を取ります。その値が1桁以上を持っている場合は、1桁の数字が生成されるまで、このように減少続けます。これは、自然数にのみ適用されます。
私のコード:
このコードは効率的ですか?私は次のエラーを取得します:
Traceback (most recent call last):
File "main.py", line 8, in <module>
test.assert_equals( digital_root(0), 0 )
File "/home/codewarrior/solution.py", line 8, in digital_root
return r
UnboundLocalError: local variable 'r' referenced before assignment
Kaleb Coberly:
あなたがreturn文に到達したときrが範囲外であるように見えます。それだけでreturn文の前に終了while文、内で局所的に適用されます。
それはあなたが唯一のreturn文を持っており、それは機能のために最も広い範囲で、そして最後にあることをことを良いことです。だから、return文と同じスコープで、whileループのRの外を宣言してみてください。そのスコープは、同様に、whileループ内のすべてが含まれています。
def digital_root(n):
x = str(n)
r = 0
while len(x) > 1:
r = 0
for i in range(len(x)):
r = r + int(x[i])
x = str(r)
return r