还有编写此函数的更好方法吗?

问题描述 投票:1回答:3

enter image description here

第一个函数返回该数字的递归数字总和。第二个函数返回字典,其中key是reg_dig_sum,value是该数字的计数。当我测试它失败给我这个

elf.assertEqual(sum_dict[0], 1) AssertionError: 0 != 1

我该如何解决?

def reg_dig_sum(n):
    x = sum(int(digit) for digit in str(n))
    if x < 10:
        return x
    else:
        return reg_dig_sum(x)

def distr_of_rec_digit_sums(low=0, high=1500):
    distr = {}
    for x in range(low, high):
        if reg_dig_sum(x) not in distr:
            distr[reg_dig_sum(x)] = 0
        else:
            distr[reg_dig_sum(x)] += 1 
    return distr
python dictionary recursion ordereddictionary
3个回答
1
投票
  • 我可以想到的问题是,您每个reg_dig_sum的数量都应该比应该少一个。这就是断言条件失败的原因。
  • 您可以通过将Distr初始化为1或删除else条件来解决此逻辑错误。
  • 我也建议您使用defaultdict之类的其他替代方法来为您进行初始化。
def distr_of_rec_digit_sums(low=0, high=1500):
    distr = {}
    for x in range(low, high):
        if reg_dig_sum(x) not in distr:
            distr[reg_dig_sum(x)] = 1 # this should be initialized to 1 for first occurance.
        else:
            distr[reg_dig_sum(x)] += 1 
    return distr
  • 使用defaultdict
from collections import defaultdict
def distr_of_rec_digit_sums(low=0, high=1500):
    distr = defaultdict(int)
    for x in range(low, high):
        distr[reg_dig_sum(x)] += 1 
    return distr

1
投票

查看有关将0更改为1的以前的评论和答案

也尝试对reg_dig_sum使用更简单的代码,结果相同:

def reg_dig_sum(n):
    return (n - 1) % 9 + 1

0
投票

我使用一个简单的功能已经很长时间了:

def sum_digits(num):
    if num <= 9:
        return num
    num = int(num / 10) + num - int(num / 10) * 10
    ''' takes the last digit of num off, and adds it to num. '''
    return sum_digits(num)

您可以使用此功能找到很多东西。在幂级数上尝试一下,您会明白我的意思。实际上,您可以在数字行上使用的任何数学函数都将返回有趣的模式。此功能可帮助您了解部分内容。

© www.soinside.com 2019 - 2024. All rights reserved.