2010-06-30 8 views
1

Ma fonction prend une entrée numérique de l'utilisateur et somme récursivement le nombre 'n' à un.
La saisie d'un 5 équivaudrait à 1/5 + 1/4 + 1/3 + 1/2 + 1/1.La fonction récursive renvoie un résultat inattendu

#include<stdio.h> 
#include<conio.h> 
//to 
float recursion(float num,float sum); 
void main(void) 
{ 
    float num=5,sum=0; 
    //input num 
    printf("%d",recursion(num,sum)); 

    getch(); 
} 

float recursion(float num,float sum) 
{ 
    // int sum=0; every time u run it the sum is assigned 0 
    if(num==1) 
    return 1; 
    else 
    { 
    sum=sum+(1/num); 
    num--; 
    recursion(num,sum); 
    } 
    return sum; 
}//recursion function ends 

Le problème est, qu'il donne 0:/Quelqu'un peut-il aider, s'il vous plaît?

+1

Indiquez votre question dans le corps de la question afin que votre question ne se ferme pas. – AraK

+1

Les devoirs peut-être? – spender

+1

Avez-vous essayé de vérifier ce qui se passe dans le débogueur? il y a une erreur triviale. mais vous devriez essayer de le résoudre vous-même avant de poser de telles questions. –

Répondre

1

Pourquoi le printf("%d") est-il censé imprimer un flottant? Est-ce que cela n'affiche pas un nombre entier faisant toujours 0 pour un flottant inférieur à 0?

float recursion(float num) 
{ 
    if(num==1.0f) 
    { 
     printf("1/1 = "); 
     return 1.0f; 
    } 
    float inverse = 1.0f/num; 
    printf("1/%.0f + ", num); 
    return (inverse + recursion(--num)); 
}//recursion function ends 

Voici le code de test:

float num=5,sum=0; 
float expected = 0; 
for (int i = 1; i <= num; ++i) 
{ 
    expected += 1.0f/i; 
} 
//input num 
printf("Expected %f and got %f",expected, recursion(num)); 

Sortie:
1/5 + 1/4 + 1/3 + 1/2 + 1/1 = Expected 2.283334 and got 2.283334

Hope this helps.

+0

pouvez-vous m'aider avec mon code? –

-1

Utilisez sum=sum+(1.0/num);. Lorsque vous divisez 1, un entier avec un flottant, le flottant est converti en entier en premier.

+2

num est un flottant, 1/num est déjà converti en double. –

+0

Je crois que l'opérateur de division, en donnant un opérande à virgule flottante et un opérande intégral, retournera automatiquement un résultat à virgule flottante. – stinky472

+0

... ce que dit Alexandre. – stinky472

5

Vous devez retourner le résultat de l'appel récursif:

return recursion(num,sum); 

au lieu de return sum.

+4

Et '% d' devrait être changé en'% f'. – tur1ng

+0

+1. Je pense que c'est au moins l'un des plus gros problèmes du PO. Il n'y a rien de mal avec la division. – stinky472

+0

@ tur1ng: bon point, cela explique le 0 au lieu de 0.2 – tanascius

0
float recursion(float num) { 
    if(num==1) 
    return 1; 
    return (1.0/num) + recursion(num - 1); 
} 

Soit dit en passant, ne pas entrer un nombre négatif!

-1
float recursion(int num) { 
    if (num == 0) { 
    return 0; 
    } 

    return 1/num + recursion(num--); 
} 
+0

Assez sûr que cela retournera toujours 0 en raison de la division entière. – IVlad

+3

Ceci est en fait un comportement non défini (en utilisant 'num' et' num - 'sans un point de séquence entre eux). Et même si ce n'était pas le cas, cela ne ferait pas ce que vous voulez car num serait le même dans chaque appel récursif. – sepp2k

0

@fahad: Les changements dans votre code a été commenté dans le code ci-dessous:

float recursion2(float num,float sum) 
{ 
    // int sum=0; every time u run it the sum is assigned 0 
    if(num==1) 
     // Vite Falcon: Needs to return sum + 1 
     return sum + 1.0f; 
    else 
    { 
     // Vite Falcon: This is not really necessary. 
     //sum=sum+(1/num); 
     float inverse = 1.0f/num; 
     num--; 
     // Vite Falcon: The new sum is returned by the recursive function and so 
     // should be stored and returned. 
     sum = recursion2(num,sum + inverse); 
    } 
    return sum; 
}//recursion function ends 

PS: Désolé je devais répondre à nouveau parce que je ne sais pas comment ajouter le code multi-ligne comme un commentaire .