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?
Quel désordre est cette fonction ... – DGomez
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
@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. –