范围之间的自然数之和

时间:2015-07-17 19:49:39

标签: python

这是我在求职面试中被问到的一个问题。

问题是如何将1到100之间的所有自然数相加,我也要求在python中编写这个程序。

那是我写的代码:

def sumNaturalNumbers(start, end, total_sum):
    li = range(start, end)
    sum = li[0] + li[-1]
    li.remove(li[0])
    li.remove(li[-1])
    total_sum += sum
    if len(li) == 0:
        return total_sum
    return sumNaturalNumbers(li[0], li[-1]+1, total_sum)

print sumNaturalNumbers(1,101, 0)

有什么我可以改变\修复使这个功能更加pythonic,所以我可以在下一次面试时提高自己吗?

修改

我的目的是在列表中对每个迭代中的第一个和最后一个项目求和,并将它乘以50.我要求展示我的思维方式,然后在解释之后,实现它。 我知道函数sum,但我需要以这种方式实现它。

8 个答案:

答案 0 :(得分:2)

有一个内置函数sum,它对输入的列表求和:

sum(range(start, stop+1))
>>> sum(range(1, 11)) #Sum of numbers between 1 and 10, inclusive
55
>>> sum(range(1, 101)) #Sum of numbers between 1 and 100, inclusive
5050
>>> 

答案 1 :(得分:1)

def sum_nums_in_range(start, end):
    repeating_sum = 0
    li = range(start, end + 1)
    first_half = li[:len(li)/2]
    second_half = li[len(li)/2:]
    for a, b in zip(first_half, reversed(second_half)):
         repeating_sum = a+b

    return repeating_sum * len(li)/2

答案 2 :(得分:1)

那样的东西?

def sum_gauss(start, end):
    return ((end-start+1)/2) * (end+start)

(在Python 2中,您需要from __future__ import division

答案 3 :(得分:1)

如果你应该递归,一个简单的方法就是从结尾删除1直到你开始:

def sumNaturalNumbers(start, end):
    if end == start:
        return start
    return end + sumNaturalNumbers(start, end-1)

答案 4 :(得分:1)

def sumNaturalNumbers(start, end):
    return (start + end) * (end - start + 1) // 2

>>> sumNaturalNumbers(1, 10)
55
>>> sumNaturalNumbers(1, 100)
5050

答案 5 :(得分:1)

评论内联

def foo(start, end):
    '''return the sum of the range start --> end
    '''
    # sum([2,3,4]) == sum([2,2,2]) + sum([0,1,2]) 
    # first part of the sum is the min value times the length
    n = end - start
    b = start * n
    # the second part is the sum of the difference between the
    # min value and all the other items
    # this turns out to be equivalent to sum(range(1, n-1))
    # applying the infamous formula to this range
    m = n-1
    c = m*(m+1)/2
    # return the sum of the two parts
    return b + c

>>> 
>>> foo(1,10)
45
>>> foo(2,11)
54
>>> foo(2,10)
44
>>> 

答案 6 :(得分:1)

def sumBetween(lower, upper):
    return sum(range(lower, upper))
sumBetween(1,101)

为什么简单时会使事情复杂化?

答案 7 :(得分:-1)

x = (lambda x: ((x * x + x)/2))(100)
print(x)
# aka 
print((lambda x: ((x * x + x)/2))(100))