lunedì 16 agosto 2010

esercizio 6 Euler Project Python

hi all!
oggi voglio mostrare al grande pubblico vari modi per risolvere l'esercizio 6 dell'Euler Project.

problema:
------------------------------------------------------------------------------------------

The sum of the squares of the first ten natural numbers is,

12 + 22 + ... + 102 = 385

The square of the sum of the first ten natural numbers is,

(1 + 2 + ... + 10)2 = 552 = 3025

Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 − 385 = 2640.

Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.

---------------------------------------------------------------------------------------------------------

beh, si vede, è molto semplice, sia in Python che in C++


codice Python

-------------------------------------------------------------------------------------

#!/usr/bin/env python

sum_square=lambda n: sum([i**2 for i in xrange(n+1)])

square_sum=lambda n: ((n*(n+1))/2)**2

problem_6=lambda n: square_sum(n)-sum_square(n)

#in alternativa... versione ricorsiva!

sum_square_rec=lambda number, actual=0: return actual==number and number**2 or (actual**2)+sum_square(number, actual+1)

square_sum_rec=lambda number, actual=0: return (actual==number and number) or (actual==0 and square_sum(number, actual+1)**2) or actual+square_sum(number, actual+1)

-------------------------------------------------------------------------------------

Spieghiamo ora il codice.

sum_square: questa semplice funzione fa la somma di tutti gli elementi di una list comprehension, nella quale ogni elemento è il quadrato di un numero che va da 0 a n+1

square_sum: questa semplice funzione ricava la somma di tutti i numeri da 1 a n compreso tramite una semplice formula: (n*n+1)/2. Ci vuole poco poi per farne il quadrato.

sum_square_rec: questa semplice funzione ha come caso base il confronto tra actual e number, se sono uguali viene restituito number elevato alla seconda, altrimenti si richiama la funzione sommando actual alla seconda.

square_sum_rec: questa semplice funzione ha 2 casi base:

  • se actual==number: viene restituito number
  • se actual==0: viene restituito il risultato della funzione con actual aumentato di 1 elevato alla seconda. questo caso base serve per poter avere un'elevazione a potenza della somma di tutti i numeri.
  • caso normale: si somma actual al risultato della funzione con actual aumentato di 1

appare molto semplice, no? ecco la potenza del Python!

stay tuned!

0 commenti:

Posta un commento