Python 3.x DigitalRoot的时间复杂度是多少?

Python 3.x DigitalRoot的时间复杂度是多少?,python-3.x,recursion,Python 3.x,Recursion,例1: 输入: n=1 产出:1 说明:1的数字根为1 例2: 输入: n=99999 产出:9 说明:99999的数字之和为45 这不是一个单位数,因此 45的数字之和是9,这是一个单数 数字 有人能帮忙我的代码的时间复杂度是多少?我认为是O(loglog(N)),但不确定 def sumOfDigits(n): if n==0: return 0 else: return int(n%10) + sumOfDigits(n//10)

例1: 输入: n=1 产出:1 说明:1的数字根为1

例2: 输入: n=99999 产出:9

说明:99999的数字之和为45 这不是一个单位数,因此 45的数字之和是9,这是一个单数 数字

有人能帮忙我的代码的时间复杂度是多少?我认为是O(loglog(N)),但不确定

def sumOfDigits(n):
    if n==0:
        return 0
    else:
        return int(n%10) + sumOfDigits(n//10)
        

def digitalRoot(n):
    ans = n
    if n<=9:
        return n
    else:
        while ans>9:
            ans = sumOfDigits(ans)
            
        return ans


def sumOfDigits(n):
如果n==0:
返回0
其他:
返回整数(n%10)+数字总和(n//10)
def digitalRoot(n):
ans=n
如果n9:
ans=数字总和(ans)
返回ans
让我们计算第一步的复杂性 如果算法取决于其包含的位数,则该算法的时间复杂度为:

O(log10(n))

这是因为我们用10进制表示数字。 例如,这将使关系非常清楚:

O(log10(100))=2

O(log10(1000))=3

O(log10(10000))=4

现在这在某种程度上回答了这个问题,如果我们只添加一次所有数字,我们就到此为止。

但既然我们没有,让我们继续前进。现在,如果所有数字都加一次,我们再加一次结果数的数字。使其成为收敛级数

因此,答案可以是:

O(log10(n))+O(log10(n))+O(log10(n)))+…


这是我对复杂度上限的最佳估计。

1)是什么让你认为
digitalRoot
的复杂度是
O(log(log(n))
?2)你认为函数的复杂度是多少,你们知道模9有什么很酷的地方吗?因为它的时间复杂度是O(log(n)),这是正确的;和digitalRoot反复调用数字的总和。变量
ans
的值衰减非常快,因此第一次调用的时间最长。在第一次调用中,
ans==n
。因此,对
sumOfDigits
的第一次调用已经花费了
log(n)
操作。请注意,
log(n)
大于
log(log(n))
。因此,您应该期望
digitalRoot
的复杂性至少是
log(n)
,当然不是
log(log(n))
。明白了!,非常感谢!这不是一个无限和
log(log(log(…))
很快变成
1
。因此,复杂度是
O(log(n))+k(n)*O(log(log(n))
其中
k(n)
是迭代次数,直到
ans还请注意,一旦对数位于
O()
:对于任何两个基数
a
b
log\u a(x)=log\u b(x)/log\u b(a)
,指定对数的基数是没有意义的,因此,
log_a(n)==O(log_b(n))
不知道这一点。谢谢!当
log_a(b)
为整数时,不同对数基之间的这种关系变得更加明显;例如,log_256给出表示数字的字节数,log_16给出表示数字的“十六进制数字”(也称为半字节)数;log_16(256)=2,因此表示一个数字所需的十六进制数是表示字节数的两倍;log_2(256)=8,因此用二进制表示一个数字所需的比特数是字节数的8倍;如果按8对位进行分组,则得到字节;如果将位按4分组,则得到半字节;将一小段按2分组,得到字节数。对数是如此迷人,同时又如此可怕。。没有提到O(…)中的碱,因为我们可以把它去掉,我从来没有想到过