2013-05-02 2 views
-3

Je suis en train d'implémenter une bibliothèque de grands nombres, et je suis coincé sur un problème étrange. J'ai une implémentation récursive de la multiplication, mais le premier appel récursif ne commence même pas à se résoudre. Voici une partie du code (ce qui est à l'intérieur de la classe BigInt):récursivité C++ dans une classe de grand nombre

BigInt multiply_utility(BigInt num1, BigInt num2) 
{ 

    cout << "Location 1"; 

    if(num1.get_length() == 1) 
    { 
     if(num1.get(MAX-1) == 0 || num2.get(MAX-1) == 0) 
      { 
       BigInt zero; 
       return zero; 
      } 
     BigInt temp = num2; 

     for(int i = 1; i < num1.get(MAX-1); i++) 
      num2 = temp.add(num2); 

     return num2; 
    } 

    else if(num2.get_length() == 1) 
    { 
     if(num1.is_zero() || num2.is_zero()) 
     { 
      BigInt zero; 
      return zero; 
     } 
     BigInt temp = num1; 

     for(int i = 1; i < num2.get(MAX-1); i++) 
      num1 = temp.add(num1); 

     return num1; 
    } 

    int m = max(num1.get_length(), num2.get_length()); 
    BigInt low1, low2, high1, high2; 


    for(int i = MAX-num1.get_length(); i < MAX-(num1.get_length()/2); i++) 
     low1.set((MAX-((MAX-(num1.get_length()/2))-i)) ,num1.get(i)); 
    low1.auto_set_length(); 


    for(int i = MAX-num2.get_length(); i < MAX-(num2.get_length()/2); i++) 
     low2.set((MAX-((MAX-(num2.get_length()/2))-i)) ,num2.get(i)); 
    low2.auto_set_length(); 

    for(int i = MAX-(num1.get_length()/2); i < MAX; i++) 
     high1.set(i,num1.get(i)); 
    high1.auto_set_length(); 

    for(int i = MAX-(num2.get_length()/2); i < MAX; i++) 
     high2.set(i,num2.get(i)); 
    high2.auto_set_length(); 

    cout << "low1 = " << low1.str() << endl; 
    cout << "high1 = " << high1.str() << endl; 

    cout << "low2 = " << low2.str() << endl; 
    cout << "high2 = " << high2.str() << endl; 

    BigInt z0,z1,z2; 
    BigInt handle; 

    cout << "Location 2"; 
    z0 = multiply_utility(low1,low2); 
    cout << "Location 3"; 

    z1 = multiply_utility(low1.add(high1),low2.add(high2)); 
    z2 = multiply_utility(high1,high2); 



    BigInt a; 

    a = z1.subtract(z2); 
    a = a.subtract(z0); 

    return (((z2.shift(m)).add(a.shift(m/2))).add(z0)); 

    /* 
    return (z2*10^(m))+((z1-z2-z0)*10^(m/2))+(z0) 
    */ 
} 

Il imprime « emplacement 1 » puis « emplacement 2 », mais ne pas impression « emplacement 1 » à nouveau comme il se doit avec appel récursif. Une idée de ce qui pourrait être faux? Se pourrait-il que ce soit une fonction de classe?

+2

Quel désordre est cette fonction ... – DGomez

+0

Je l'écris à la hâte, je pourrais facilement le rendre plus propre. Quel que soit le style, le problème de récurrence ne devrait pas se produire. – Nathan

+1

@Nathan: Pourriez-vous essayer d'ajouter un 'std :: endl' après chaque' cout'. Cela entraînera stdout pour vider le flux qui peut être votre problème. –

Répondre

1

Ne pouvez-vous pas mettre un point d'arrêt pour le déboguer?

Je soupçonne que le code atteint un return à un certain point et sortez de cette fonction, donc, n'affiche pas "location ..." comme vous le souhaitez.

+0

essayé le débogage et il semble être un débordement de pile – Nathan

0

Ok tout le monde, il semble y avoir un débordement de pile. Les objets que je créais étaient trop volumineux pour être placés sur la pile et la récursion l'a trop taxé. Merci quand même!

Questions connexes