首先编写一个名为rec_dig_sum的函数,它接受一个整数并返回该数字的递归数字和。
递归数字和的例子:
101 => 1+0+1 = 2
191 => 1+9+1 = 11 => 1+1 = 2
5697 => 5+6+9+7 = 27 => 2+7 = 9然后在另一个名为distr_of_rec_digit_sums的函数中使用该函数,该函数返回一个字典,其中键是递归数字和,值是在输入数字的低(包括)范围内发生的那些数字和的计数。假设低整数和高整数是正整数,高整数大于低整数,低整数和高整数都不是负整数。
我的第一部分是:
def rec_dig_sum(n):
total = 0
for i in str(n):
total += int(i)
return total发布于 2020-07-17 04:54:45
令我烦恼的是,OP的递归解决方案和这里提出的其他解决方案中间都有一个for循环!让我们在这个问题上完全(加倍)递归!由于这是一个数字问题,让我们也抛出其他人都在使用的str()函数:
def rec_dig_sum(number):
if number < 10:
return number
quotient, remainder = divmod(number, 10)
return rec_dig_sum(rec_dig_sum(quotient) + remainder)
print(rec_dig_sum(101))
print(rec_dig_sum(191))
print(rec_dig_sum(5697))输出
> python3 test.py
2
2
9
>第二个函数的示例解决方案是传统的,但我使用dict.fromkeys()方法的机会之一是:
def distr_of_rec_digit_sums(low=0, high=1500):
histogram = dict.fromkeys(range(10), 0)
for number in range(low, high + 1): # a low and high (inclusive) range
histogram[rec_dig_sum(number)] += 1
return histogram
print(distr_of_rec_digit_sums(0, 1500))输出
> python3 test.py
{0: 1, 1: 167, 2: 167, 3: 167, 4: 167, 5: 167, 6: 167, 7: 166, 8: 166, 9: 166}
> 发布于 2020-07-16 22:39:41
所以你的问题的两个部分。
首先,递归函数:
def recursive_digits(n):
total = sum([int(i) for i in str(n)])
if total < 10:
return total
else:
return recursive_digits(total)然后在另一个函数中使用它:
def distr_of_rec_digit_sums(low, high):
digits = {item : 0 for item in range(10)}
for i in range(low, high+1):
digits[recursive_digits(i)] += 1
return digits因为函数名以'distr‘开头,我想,有人对以数字和表示的分布感兴趣。这是令人惊讶的(或不出所料)的制服。这是你问题的范围(0-1500)。

发布于 2020-07-16 22:16:46
你就快到了
如果没有递归,它将是:
def rec_dig_sum(n):
total = 0
for i in str(n):
total += int(i)
return str(total)
t = "5697"
while len(t) != 1:
t = rec_dig_sum(t)
print (t)带递归
我们需要一个条件来摆脱递归,在这种情况下,我们想要在数字数为1时停止,也就是说,如果是len(n) === 1,我们就会中断。
如果没有,我们计算当前和,然后再开始。
def rec_dig_sum(n):
if len(n) == 1:
return int(n)
total = 0
for i in str(n):
total += int(i)
return rec_dig_sum(str(total))
rec_dig_sum(str(5697))如果您正在学习递归并面临困难,请从编写相同的使用循环(非递归)开始,然后通过指定目标来删除循环来使其成为递归的。
https://stackoverflow.com/questions/62944232
复制相似问题