Python中子序列递归的总和

时间:2014-05-27 00:26:50

标签: python recursion

上周末,我正在研究HackerRank上的Ad Infinitum挑战。

如果每个子序列被认为是整数,则一个问题是计算有限序列的所有子序列的总和。

例如,序列4,5,6会给出答案4 + 5 + 6 + 45 + 46 + 56 + 456 = 618。

我发现了一个递归并在下面编写了Python代码。它解决了5/13个测试用例。

其余的8/13测试用例存在运行时错误。

我希望有人可以在代码中监视效率低下的地方,以及如何加速它们。或者,帮助我决定一定是我的递归不是最好的策略。

# Input is a list, representing the given sequence, e.g. L = [4,5,6]

def T(L): 
    limit = 10**9 + 7  # answer is returned modulo 10**9 + 7
    N = len(L)
    if N == 1: 
        return L[0]
    else:
        last = L[-1] 
        K = L[:N-1]
        ans =  T(K)%limit + 10*T(K)%limit + (last%limit)*pow(2,N-1,limit)
        return ans%limit

3 个答案:

答案 0 :(得分:0)

嗯,你想要组合:

from itertools import combinations

def all_combinations(iterable):
    for r in range(len(digits)):
        yield from combinations(digits, r+1)

并且您想将它们转换为整数:

def digits_to_int(digits):
    return sum(10**i * digit for i, digit in enumerate(reversed(digits)))

你要总结一下:

sum(map(digits_to_int, all_combinations([4, 5, 6])))

然后专注于速度。

答案 1 :(得分:0)

假设你的意思是连续的后续序列。

test = [4, 5, 6]

def coms(ilist):
    olist = []
    ilist_len = len(ilist)
    for win_size in range(ilist_len, 0, -1):
        for offset in range((ilist_len - win_size) + 1):
            subslice = ilist[offset: offset + win_size]
            sublist  = [value * (10 ** power) for (power, value) in enumerate(reversed(subslice))]
            olist.extend(sublist)
    return olist

print sum(coms(test))

答案 2 :(得分:0)

这是我提交的同一问题(Manasa和子序列)。 https://www.hackerrank.com/contests/infinitum-may14/challenges/manasa-and-sub-sequences

我希望这会帮助你想出更好的方法。

ans = 0
count = 0
for item in raw_input():
    temp = (ans * 10 + (count + 1)*(int(item)))%1000000007
    ans = (ans + temp)%1000000007
    count = (count*2 + 1)%1000000007

print ans