Funkcja rekurencyjna sumy szeregu przemiennego

Funkcja rekurencyjna sumy szeregu przemiennego
I4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

Hej:)
Niedawno opracowałam algorytm funkcji rekurencyjnej która ma zwrócić sumę ciągu 1+1/2+1/3+...+1/n (n wprowadza użytkownik) wygląda on tak:

float sum(int n){
if(n==1) return 1.0;
else return sum(n-1)+1.0/n;
}

zastanawiam się w jaki sposób można by było przekształcić tą funkcję rekurencyjną by liczyła sumę ciągu przemiennego tzn.:
1-1/2+1/3-1/4+....+1/n

ja bym zaproponowała coś takiego:

float sum(int n){
if(n==1) return 1.0;
else if(n%2==0) return sum(n-1)-1.0\n;
else return sum(n-1)+1.0/n;
}

Pytanie tylko czy coś takiego przejdzie i będzie poprawnie liczyło sumę? Nie potrzebuję pełnego programu interesuje mnie tylko ta część rekurencyjna.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
#include <stdio.h>

float sum(unsigned n)
  {
   return n<=1?1:sum(n-1)+1.0/n;
  }

int main()
  {
   unsigned i;
   for(i=1;i<=10;++i) printf("sum(%d)=%f;\n",i,sum(i));
   return 0;
  }
tubbs
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 13
0

Witam, mam takie pytanie. Dlaczego w poniższej funkcji rekurencyjnej ciągu przemiennego:

Kopiuj
float sum(int n)
{
	if(n==1) return 1;
	else return (1.0/n)-sum(n-1); 
}

suma ta jest liczona: 1 - 1/2 + 1/3 - ... ,
przecież rekurencyjnie wychodząc z każdego zapętlenia powinno być: 1 - 1/2 - 1/3 - ... .
I jaka jest różnica między: return (1.0/n)-sum(n-1), a return sum(n-1)-(1.0/n)?
Mógłby mi ktoś to wytłumaczyć krok po kroku. Z góry wielkie dzięki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.