I am trying to print the sum of all numbers up to an input "n"

Question:

#This program defines a function named find_sum to calculate the sum of numbers
#from 0 to n, where n is number entered by a user

#input = 3 so 1 + 2 + 3 = 6(result)
#input = 10 result = 55

n = int(input("Enter a number: "))

def main(): 
    
    result = find_sum(n)
    print("The result is", result)
    
        
def find_sum (n):

    sum = 0
    while ( n >= 0):
        sum += n
        n -= 1
        return sum
        
main()

The problem is that it would print the value n without computing the sum. I am not sure how to fix it. I also want to know if there’s a way to do this recursively.

Asked By: toothpaste_123

||

Answers:

There’s a number of problems with your code. But the main issue is that you return sum inside the loop, you should reduce the indent:

def find_sum(n):
    sum = 0
    while (n >= 0):
        sum += n
        n -= 1
    return sum

Some other remarks:

  • you shouldn’t use names like sum since they "shadow" a built-in name. sum() is a built-in function for summing values.
  • you define a main() function, which is good, but then proceed to perform part of the logic one would expect in the main body outside the function (the input and type conversion).
  • you call a function from main() that hasn’t been defined at that point; not impossible, but generally it’s good form to define something before you use it.
  • you use a while loop, where a more succinct for loop would work better.

With that in mind:

def find_sum(n):
    total = 0
    for x in range(n):
        total += x + 1
    return total


def main():
    n = int(input("Enter a number: "))
    result = find_sum(n)
    print("The result is", result)


main()

A more succinct way of writing find_sum():

def find_sum(n):
    return sum(range(n + 1))

Finally, the point of defining a main() function in Python is often to make your script reusable as a module you can then import without running the main logic.

However, to avoid that from happening you need to run the main() conditional upon the script being the main script (or just a module):

if __name__ == '__main__':
    main()

So, the result:

def find_sum(n):
    return sum(range(n + 1))


def main():
    n = int(input("Enter a number: "))
    result = find_sum(n)
    print("The result is", result)


if __name__ == '__main__':
    main()

Also, as use @timroberts pointed out in the comments, for this particular problem, the outcome is the same as n * (n + 1) // 2, so there’s no real need to loop – but that’s optimising beyond what has been asked of you, perhaps.

Answered By: Grismar
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.