2010-11-11 10 views
0

voici comment j'appelle la fonction suivante:C# pourquoi mon DECIMAL est-il négatif?

List<decimal> numbers = new List<decimal>(); 

    numbers.Add(210m); 
    numbers.Add(188.83m); 
    numbers.Add(67.93m); 
    numbers.Add(125.92m); 
    numbers.Add(35.92m); 
    numbers.Add(19.16m); 
    numbers.Add(98.48m); 



    List<decimal> listresult = FindSumSubset(9075.12m, numbers); 

** * ** * ** * ***la fonction *

List<decimal> FindSumSubset(decimal sum, List<decimal> list) 
      { 
       for (int i = 0; i < list.Count; i++) 
       { 
        decimal value = list[i]; 
        if (sum - value == 0.0m) 
        { 
         return new List<decimal> { value }; 
        } 
        else 
        { 
         var subset = FindSumSubset(sum - value, list.GetRange(i + 1, list.Count-1 -i)); 
         if (subset != null) 
         { 
          subset.Add(value); 
          return subset; 


         } 
        } 
       } 
       return null; 
      } 

lorsque je cours en mode débogage, le decimal sum me donne un énorme n valeur egative comme -93435.34

comment cela peut-il se produire?

+1

votre autre cas est en dehors d'une boucle for, est-ce une faute de frappe? –

+0

Vérifiez votre code. Vous avez une clause else après une boucle for. –

+0

Je pense que j'ai corrigé le code (annulé une partie de l'édition précédente), mais maintenant 'nouvelle liste {valeur};' ne compilera pas. – egrunin

Répondre

4

Essayez de faire ce changement:

if (sum - value <= 0.0m) 

Le problème est que la somme de la valeur est pas exactement 0 donc il ne cesse de récursion pour toujours.

En outre, je pense que vous voulez supprimer la boucle for. Vous n'en avez pas besoin si vous recurse.

0

Vous débordez et ne pas vérifier est ma conjecture.

+2

Je ne pense pas que la décimale puisse déborder. C'est un point flottant, et je pense qu'il lance même des exceptions s'il devient trop grand au lieu d'utiliser une valeur infinie. – CodesInChaos