Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        去年关闭。
                                                                                            
                
        
我正在做a challenge on codewars,我应该用Python编写一个数字根函数。我不知道为什么它不起作用。这是我第一次尝试递归。我真的很想解决这个问题。

def digital_root(num):
        #Check to see if num has more than one digit
        if num > 9:
            x = 0
            z = 1
            #Create an array of the digits in num
            digits = [int(d) for d in str(num)]

            #Convert string elements in digits[] to ints
            for n in digits:
                digits[x] = int(x)
                x = x + 1

            #Add each element in digits[] to digits[0]
            for n in digits:
                digits[0] = digits[0] + digits[z]

                #If digits[0] has more than one digit, then run digital_root with digits[0] in the parameters
                if digits[0] > 9:
                    digital_root(digits[0])
                else:
                    return digits[0]
        else:
            return num

digital_root(15)


>> Program finished with exit code 0

最佳答案

您的功能有很多问题。让我们往下看。



#Convert string elements in digits[] to ints
for n in digits:
    digits[x] = int(x)
    x = x + 1


本节旨在将digits的元素转换为int,但是digits的元素已经是int。较早的列表理解已经产生了整数:

digits = [int(d) for d in str(num)]
#         ^^^^^^


整个部分都是不必要的。甚至没有用正确的整数填充digits。而不是在int的元素上调用digits,而是在索引上调用int。此外,循环不使用循环变量n



for n in digits:
    digits[0] = digits[0] + digits[z]


此循环尝试将所有数字加在一起。但是,z永远不会递增,因此每次都会将digits[1]添加到digits[0]。同样,即使将循环更改为增加z,它也很可能走得太远,超出列表的末尾。 z从1开始,并且循环为digits的每个元素执行一次迭代,因此到最后一次迭代,z将超过列表的末尾。同样,再次使用n变量。

在循环中,使用digits[0]作为保存总和的位置会混淆digits数组的含义。最好使用一个单独的变量(这样做可以避免在z处启动1),但是由于Python已经具有sum函数,因此仅使用sum会更简单。



#If digits[0] has more than one digit, then run digital_root with digits[0] in the parameters
if digits[0] > 9:
    digital_root(digits[0])
else:
    return digits[0]


这在上面的循环中,但是看起来不应该是这样。它看起来像是要在digits[0]包含和之后运行的。如果是这样,则应使其缩窄(在每行中删除4个空格)。另外,由于递归调用上没有return,因此将丢弃递归调用的返回值。



函数的正确版本可能看起来像

def digital_root(num):
    if num > 9:
        digits = [int(d) for d in str(num)]

        total = 0
        for n in digits:
            total += n

        if total > 9:
            return digital_root(total)
        else:
            return total
    else:
        return num


利用sum一个更简单的解决方案是

def digital_root(num):
    while num > 9:
        num = sum(map(int, str(num)))
    return num


或者,使其保持递归状态,

def digital_root(num):
    if num < 10:
        return num
    return digital_root(sum(map(int, str(num))))

关于python - 为什么这个数字根函数不起作用? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50278875/

10-12 20:55