# De som en het product van opeenvolgende gehele getallen Op deze pagina zijn een aantal Python programmeeropgaven en uitwerkingen gegeven met betrekking tot het optellen of vermenigvuldigen van een rij opeenvolgende getallen. ## Som van opeenvolgende getallen Schrijf een functie genaamd `som_van_getallen` die de som *S* van alle natuurlijke getallen van *b* tot en met *e* berekent en teruggeeft. Wiskundig kunnen we dit als volgt noteren: ![](figs/sum.png) Deze functie heeft de volgende parameters: `beginwaarde` en `eindwaarde`. Deze functie moet als volgt gebruikt kunnen worden: ```python print(som_van_getallen(1, 9)) print(som_van_getallen(9, 1)) print(som_van_getallen(9, 9)) ``` De juiste uitvoer is dan ``` 45 0 9 ``` ### Oplossing 1: `while`-loop ```python def som_van_getallen(beginwaarde, eindwaarde): som = 0 huidige = beginwaarde while huidige <= eindwaarde: som = som + huidige huidige = huidige + 1 return som ``` ### Oplossing 2: `for`-loop Omdat het aantal herhalingen bekend is, kan beter een `for`-loop gebruikt worden. ```python def som_van_getallen(beginwaarde, eindwaarde): som = 0 for getal in range(beginwaarde, eindwaarde + 1): som = som + getal return som ``` ### Oplossing 3: zonder herhaling Bij deze oplossing maken we gebruik van de formule die volgens [Rekenkundige rij - Wikipedia](https://nl.wikipedia.org/wiki/Rekenkundige_rij) vaak aan Gauss wordt toegeschreven: *S = ½(b+e)(e-b+1)* ```python def som_van_getallen(beginwaarde, eindwaarde): if (beginwaarde > eindwaarde): return 0 return 1/2 * (beginwaarde + eindwaarde) * (eindwaarde - beginwaarde + 1) ``` ### Oplossing 4: recursie We kunnen de herhaling ook implememteren met behulp van een recusieve functie. ```python def som_van_getallen(beginwaarde, eindwaarde): if beginwaarde > eindwaarde: return 0 return beginwaarde + som_van_getallen(beginwaarde + 1, eindwaarde) ``` ### Oplossing 5: rekenkundige rij Omdat de rij een rekenkundige rij is met beginwaarde *b*, een verschil van 1 en een aantal van *e-b+1* kunnen we ook de functie die de som van een rekenkundige rij berekent en teruggeeft gebruiken. De functie hebben we al eerder geschreven, zie [sommen_van_rijen.md](sommen_van_rijen.md). ## Product van opeenvolgende getallen Schrijf een functie genaamd `product_van_getallen` die het product *P* van alle natuurlijke getallen van *b* tot en met *e* berekent en teruggeeft. Wiskundig kunnen we dit als volgt noteren: ![](figs/product.png) Deze functie heeft de volgende parameters: `beginwaarde` en `eindwaarde`. Deze functie moet als volgt gebruikt kunnen worden: ```python print(product_van_getallen(3, 9)) print(product_van_getallen(9, 3)) print(product_van_getallen(3, 3)) ``` De juiste uitvoer is dan ``` 181440 0 3 ``` ### Oplossing 1: `while`-loop ```python def product_van_getallen(beginwaarde, eindwaarde): if (beginwaarde > eindwaarde): return 0 product = 1 huidige = beginwaarde while huidige <= eindwaarde: product = product * huidige huidige = huidige + 1 return product ``` ### Oplossing 2: `for`-loop Omdat het aantal herhalingen bekend is, kan beter een `for`-loop gebruikt worden. ```python def product_van_getallen(beginwaarde, eindwaarde): if (beginwaarde > eindwaarde): return 0 product = 1 for getal in range(beginwaarde, eindwaarde + 1): product = product * getal return product ``` ### Oplossing 3: zonder herhaling Bij deze oplossing maken we gebruik van de formule: *P = e!/(b-1)!* ```python import math def product_van_getallen(beginwaarde, eindwaarde): if (beginwaarde > eindwaarde): return 0 return math.factorial(eindwaarde) / math.factorial(beginwaarde - 1) ``` ### Oplossing 4: recursie We kunnen de herhaling ook implememteren met behulp van een recusieve functie. ```python def product_van_getallen(beginwaarde, eindwaarde): if beginwaarde > eindwaarde: return 0 if beginwaarde == eindwaarde: return beginwaarde return beginwaarde * product_van_getallen(beginwaarde + 1, eindwaarde) ```