2016-03-24 20 views
0

私は一連のカウントしようとしています:
... 1/2 + 1/3 + 1/4 + 1/5 +をしかし、私は私の出力に問題がありました。基本的なC++再帰

挿入をどのように多くのシリーズの数がカウントされます:3 //私は入力3
合計= 1 //これは、出力が示されなければならない問題である= 1.8333

私のプログラム

#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

あなたのコードにはint型しかありませんが、どのように浮動小数点数を出力すると思いますか?代わりに 'double'または' float'を使用してください – user463035818

+0

あなたの問題が再帰とは関係ないことを伝える一つの方法は、それを見て、問題が再帰とは関係ないことを確認することです。 *(代わりに、再帰を全く含まない単純な例を抽出して、計算結果が整数であることを確認してください)* – HostileFork

+0

なぜ再帰的ですか? – Transcendental

答えて

3

他の人が言ったように、doublefloatのように、浮動小数点のタイプを使用してください。整数除算で

1/3 == 0

ここで反復例は次のとおり

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; 
} 

コードが型の((小数点付き)浮動小数点定数および浮動小数点変数を使用する必要がありますdoubleまたはfloat)。

編集1:再帰のいくつかのケースでは基本的な再帰
、解決策の考え方は後方の実装を助けるかもしれません。

たとえば、シリーズは1.0/2.0から始まります。和演算は順序に依存しないので、しかし、我々は、1.0/5.0で始めることができますし、逆方向に働く:

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

これは、分母が再帰を終了するための条件として使用することができます。

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

分母<2の場合はなぜ 'return 0.0'ですか? –

+0

最初の開始値なので0.0を返します。あなたの質問から、シリーズは1.0ではなく1.0で始まります。また、この関数は 'denominator-1.0'で(再帰的に)呼び出されます。つまり、分母は2.0未満になります。 –

+0

なぜ0.5を返さないのですか?分母が2より小さい場合、値は1.0/2.0であり、1.0/2.0の結果は0.5ではなく0.0です。 –