2016-04-05 2 views
0

Для положительного целого числа N требуется суммирование 1/1 + 2/3 + ... + N/(2N-1).рекурсивное суммирование N/(2N - 1)

Мой рекурсивный метод Sum застревает в бесконечном цикле, и я не знаю почему. При печати переменных я заметил, что first (мой параметр) увеличивается. Утверждение, которое увеличивает value, никогда не достигается.

public double Sum(double first) { 

    if (first > 1) { 
    System.out.println("first :" + first); 
    value += first/(Sum(2*first - 1) + Sum(first-1)); 
    System.out.println("val: " + value); 
    return value; 
    } 

    if (first <= 1) { 
     return 1; 
    } 
    else { 
     return value; 
    } 

} 

ответ

5

Вы делаете рекурсивные звонки в ветке if (first > 1).

Первый из этих рекурсивных вызовов - Sum(2*first - 1); этот и другой рекурсивный вызов должны быть полностью оценены до value могут быть увеличены. Аргумент там также > 1, поэтому вы будете продолжать входить в одну ветвь, делая эти рекурсивные вызовы бесконечно (или, по крайней мере, до тех пор, пока вы не превысите максимальное значение, сохраненное в двойном).


Если вы хотите сделать это рекурсивно, начиная с N, вам не нужно два рекурсивных вызовов в любом случае:

public double Sum(int first) { 
    if (first <= 1) { 
    return 1; 
    } else { 
    return first/(2.0 * first - 1) + Sum(first - 1); 
    } 
} 

Затем оценить его по телефону Sum(N).

1
value += first/(2*first - 1) + Sum(first-1); 
Смежные вопросы