2014-11-28 3 views
-3
public static float recursiveUse(float n2){ 

    if(n2 == 1) 
     return 1; 
    return recursiveUse(1/n2);  
} 

public static void main(String[] args) { 
    float n2; 
    Scanner stdin = new Scanner(System.in); 
    System.out.println("Please enter a number: "); 
    n2 = stdin.nextFloat(); 

    System.out.print(1+(recursiveUse(n2))); 
} 

/* 
    Write a Java application that uses recursion to compute the results of the following series: 
    m(i) = 1 + 1/2 + 1/3 + 1/4 + 1/5 … + 1/i 

*/ 

У меня возникла проблема с исключением переполнения стека. Я уверен, что это потому, что база правильная. Мой вопрос заключается в том, как я могу найти базу для сериала чуть выше. Я искал сайт, и я не мог найти ничего подходящего для этой проблемы.Переполнение стека и поиск базы

Спасибо

+1

Почему вы ожидаете, что '1/(1/(1/(1/(1/..... n2))) ...)' будет 1? – ikh

+0

Честно говоря, я так долго работал над этим, что я действительно не знаю сейчас. – OttoMeter

ответ

0

Ваш метод recursiveUse полностью неправильный. Посмотрите на него внимательно, и вы увидите, что в зависимости от ввода он либо никогда не вернется, либо вернется только 1. Второй момент делает его бесполезным, первый заставляет его продолжать, пока он не переполнит стек.

Вы хотите получить сумму части гармонического ряда 1 + 1/2 + 1/3 … + /i. Назовём наш метод harmonicSum:

public static double harmonicSum(int i) 
{ 
    /* Code will go here */ 
} 

Теперь для любой я где я ≥ 1 результат мы должны дать будет такой же, как 1/i + harmonicSum(i - 1). Например, для 3 мы имеем 1 + 1/2 + 1/3, который равен (1 + 1/2) + 1/3, который является «гармоническимSum (2) + 1/3.

Нам нужно иметь точку, где мы просто останавливаемся и возвращаем ответ, но очевидно, что harmonicSum(0) - это 0, так что это дает нам (а также означает, что нам не нужно делить на ноль).

Поэтому код, необходимый должен сделать именно это:

public static double harmonicSum(int i) 
{ 
    if(i < 0) 
    throw new IllegalArgumentException("i must be positive."); 
    if(i == 0) 
    return 0; 
    return 1.0/(double)i + harmonicSum(i - 1); 
} 

Так как мы сделали свою домашнюю работу, постарайтесь выяснить, как сделать то же самое без рекурсии, и плюсы и минусы каждого из них.

+0

Спасибо за помощь. за пределами факториала, который использовался в классе.Кроме того, почему вы изменили параметр на int? Я попробую его с более традиционным циклом, например, for или do/while. – OttoMeter

+0

Я изменил параметр на int, потому что это соответствует тому, что вы делаете; начиная с целочисленного значения и заканчивая значением с плавающей запятой. Ваша основная проблема не имеет значимого ответа, например. '2.5'. –

+0

И действительно ли вы можете понять, как переписывать одно и то же без рекурсии, превращая рекурсивный код в итеративный, и наоборот - это важный навык реального мира, в который не входят многие классы, охватывающие каждого. (Esp., Поскольку итеративный имеет тенденцию быть более совершенным с языком, таким как Java, и рекурсивным, более функциональным - или только возможным) - в функциональных языках, поэтому имеет тенденцию быть реальными преимуществами в возможности перемещаться между ними). –

0

Издание является вы ожидаете 1/2 или 1/3 .... будет когда-нибудь будет равен 1, который никогда не удовлетворяет и, следовательно, вы продолжаете повторять рекурсивный вызов и, наконец, дает JVM в качестве StackOverflowException для вас.

Я считаю, что вы имели в виду декрементировать п2 значение, а затем проверить на равенство как 1. В любом случае, попробуйте следующее:

public static double recursiveUse(int n2) { 

    if (n2 == 1) 
     return 0.; 
    return 1/(double) n2 + recursiveUse(n2 - 1); 
} 

Это добавит 1/n2 + 1/(n2-1) в соответствии с вашими потребностями и верните результат, чтобы вы могли добавить 1 к результату, полученному с помощью этого метода.

+0

Я думаю, что у кода есть другая проблема - 'if (n2 == 1)'. Мы не должны использовать '==' с плавающей точкой в ​​этом случае, не так ли? – ikh

+0

@ikh i изменил переменную n2 на int вместо float. – SMA

+0

Извините, я видел только «double» в вашем коде> o < – ikh