2010-05-26 7 views
1

Un tableau est rempli d'éléments aléatoires (négatifs et positifs). Maintenant, je veux calculer la somme de SEULEMENT les éléments positifs.Utilisation de la récursivité pour calculer la somme des éléments positifs uniquement dans le tableau

itératif Il n'y a pas de problème, mais dans la version récursive, je ne peux obtenir que la somme des valeurs négatives et positives.

Comment puis-je "vérifier" dans la version récursive qu'il ne fait que résumer les éléments positifs?

Version itératifs:

public int IterSomPosElem(int[] tabel, int n) 
{ 
    n = 0; 

    for (int i = 0; i < tabel.Length; i++) 
    { 
     if (tabel[i] >= 0) 
     { 
      n += tabel[i]; 
     } 
    } 

    return n; 
} 

Version récursive au moment (résume tous les éléments au lieu de seulement le positif):

public int RecuSomPosElem(int[] tabel, int n) 
{ 
    if(n == 1) 
     return tabel[0]; //stopCriterium 
    else 
    { 
     return (tabel[n - 1] + RecuSomPosElem(tabel, n - 1)); // how to check, so it only sums up the postive elements and "ignores" the negative elements. 
    } 
} 
+2

Pourquoi avez-vous besoin d'une version récursive? C# n'est pas Haskell. – kennytm

Répondre

0

Quelque chose comme?

public int RecuSomPosElem(int[] tabel, int n) 
    { 
     if(n == 1) 
      return tabel[0]; //stopCriterium 
     else 
     { 
      var valueToSum = tabel[n - 1] > 0 ? tabel[n - 1] : 0; 
      return (valueToSum + RecuSomPosElem(tabel, n - 1)); 
     } 

    } 
0
public int RecuSomPosElem(int[] tabel, int n) 
{ 
    if(n == 1) 
     return tabel[0]; //stopCriterium 
    else 
    { 

     if (tabel[n - 1] > 0) 
      return (tabel[n - 1] + RecuSomPosElem(tabel, n - 1)); 
     else 
      return RecuSomPosElem(tabel, n - 1)); 
    } 

} 
2

Est-ce devoir? Pourquoi avez-vous besoin de le faire avec une fonction récursive?

Dans le monde réel, ce serait quelques simples LINQ

int positiveSum = tabel.Where(i => i > 0).Sum(); 
+0

Parce que les devoirs ne concernent pas le monde réel - les codeurs les plus directs de l'école ne peuvent pas réellement coder - et ils n'en ont pas besoin -, mais ils devraient savoir des choses de base comme la récursivité. – riffnl

+0

@riffnl - D'où la raison pour laquelle j'ai demandé si c'était les devoirs. – Jamiec

2

Que diriez-vous

int foo[] = new [] {1, -9, 10, 8, -16, ...}; 
int sumOfPostiveInts = foo.Sum(x => x < 0 ? 0 : x); 

or...foo.Where(x => x > 0).Sum(); 
0

Vous êtes si proche! En utilisant votre algorithme, mais en ajoutant simplement une vérification pour voir si la valeur actuelle dans la table est négative ou non. S'il est négatif, passez à l'élément de tableau suivant:

private static int RecuSomPosElem(int[] tabel, int n) 
    { 
     int i = n - 1; 
     while (tabel[i] < 0 && i > 0) 
      i--; 
     if (i == 0) 
     { 
      return 0; //stopCriterium 
     } 
     else 
     { 
      return (tabel[i] + RecuSomPosElem(tabel, i)); 
     } 
    } 
Questions connexes