2016-03-24 8 views
0

Ben dizi saymaya çalışıyorum: 1/2 + 1/3 + 1/4 + 1/5 + ...
Ama benim çıkışı ile sorun vardı:Temel C++ Özyineleme

takın kaç serisi numaralı sayılır: 3 // ben girişi 3
Toplam = 1 // Bu, çıkış gösterilen gereken bir sorundur = 1,8333

Programım

#include <iostream> 
#include <math.h> 
using namespace std; 
int recursion (int n); 
int main() 
{ 
    int n; 
    cout << "Insert how many number will be counted : ";cin >> n; 
    cout << "Total = " << recursion(n); 
} 
int recursion (int a) 
{ 
    int result; 
    if (a >= 1) 
    { 
     result = 1; 
    } 
    else 
    { 
     result = (pow (a , -1) + recursion (pow ((a - 1) , -1))); 
    } 
    return (result); 
} 
+8

kodunuz sadece int's, bunun nasıl bir kayan nokta numarası yazdırmasını beklersiniz? – user463035818

+0

yerine 'double' veya' float' kullanın. Sorunuzun özümsemeyle ilgisi olmadığını söylemenin bir yolu, ona bakmaktır ve sorununun yineleme ile ilgisi olmadığını kontrol etmektir. * (Alternatif olarak, özyinelemeyi içermeyen basit bir örnek alın ve hesaplama sonuçlarınızın hala tamsayı olduğunu görün.) * – HostileFork

+0

Neden bu kadar özyinelemeli? – Transcendental

cevap

3

Diğerleri de söylediğimiz gibi, double veya float gibi kayan nokta türlerini kullanın. tamsayı bölme içinde

, 1/3 == 0

burada yinelemeli bir örnek:

const unsigned int NUMBER_OF_TERMS = 100; 
double result = 0.0; 
double denominator = 2.0; 
for (unsigned int i = 0; i < NUMBER_OF_TERMS; ++i) 
{ 
    result = result + 1.0/denominator; 
    denominator = denomenator + 1.0; 
} 

Çeşidi (nokta değişkenleri (ondalık noktaları ile) noktası sabitleri yüzer ve yüzer kullanmak gerekmektedir, kod double veya float).

Düzenleme 1: Temel özyineleme uygulanmasına yardımcı olabilecek geriye çözümün düşünme özyineleme Bazı durumlarda,
. Örneğin, seri 1.0/2.0 ile başlar. toplamı operasyon sırasına bağlı değildir çünkü Ancak, biz 1.0/5.0 ile başlayabilir geriye doğru gidiyorum:

result = 1.0/5.0 + 1.0/4.0 + 1.0/3.0 + 1.0/2.0 

Bu payda Özyinelemeyi sonlandırma koşulu olarak kullanılmasına olanak tanır.

double recursive_sum(double denominator) 
{ 
    if (denominator < 2) 
    { 
    return 0.0; 
    } 
    return recursive_sum(denominator - 1.0) 
     + 1.0/denominator; 
} 
+0

niçin denominator <2 ise 'return'? –

+0

0.0 dönüyorum çünkü ilk başlangıç ​​değeri. Sorunuzdan, dizi 1.0/2.0 ve 1.0 değil ile başlar. Ayrıca, işlevin “payda” ile (yinelemeli olarak) çağrıldığını da unutmayın. Bu, paydaların en az 2.0'dan daha az olacağı anlamına gelir. –

+0

neden 0,5 değil? payda <2 olduğunda, değer 1.0/2.0, ve 1.0/2.0 sonucu 0,5 değil 0.0 değil mi? –