2014-04-18 3 views
0

Я пытаюсь найти разделы с цифрами формулу Эйлера для этого:Partition на основе формулы Эйлера

Это дает результаты, как:

P(3) = P(2) + P(1) = 3 
P(4) = P(3) + P(2) = 3+ 2 = 5 
P(5) = P(4) + P(3) - P(0) = 5 + 3 - 1 = 7 
P(6) = P(5) + P(4) - P(1) = 7 + 5 - 1 = 11 and so on.. 
* P(0) = 1 

Он производит два положительные, а затем два отрицательных значения и т. д.

Я использую для этого рекурсию, но код переходит в бесконечный цикл без какого-либо результата.

long result = 0; 
long counter = 0; 

class Euler 
{ 
public: 
long Partition(long n) 
{ 
    int exponent = 0; 
    if (n < 0) 
    { 
     return 0; 
    } 
    else 
    { 
     counter = counter + 1; 
     exponent = pow(-1, counter - 1) ; 

     if (n == 0) 
     { 
      n = 1; 
     } 

     return Partition((exponent * (n - ((counter * ((3 * counter) - 1))/2)))) + 
     Partition(((exponent * (n - ((counter * ((3 * counter) + 1))/2))))); 
    } 

} 
}; 

int main(int argc, char** argv) 
{ 
    long result= 0; 
    long a = 3; 
    Euler * obj = new Euler(); 
    long s = obj->Partition(a); 
    std::cout << s; 
    return 0; 
} 
+0

a) Не используйте float point для решения +/-. (-1)^n с натуральным числом n равно 1, если n четное, else -1 – deviantfan

+0

b) Возврат 0, если 'n <= 0' не' n <0' – deviantfan

+0

Это должно быть <0, так как если n == 0 это означает n = 1. См. Ниже, где я определил его. – user3017335

ответ

1

Ваш глобальный counter модифицируется первым вызовом Partition, поэтому второй один работает на другом один; на самом деле, counter изменяется более или менее непредсказуемо.

Не используйте глобальные переменные.

Смежные вопросы