Рекурсивная гармоническая функция возвращает NaN - PullRequest
3 голосов
/ 01 марта 2010

Я написал следующий пример кода, чтобы найти значение гармоники N. (1 + 1/2 + 1/3 + ... 1 / N). Прочитайте комментарии в коде, написанном жирным шрифтом, и помогите мне выяснить, почему это происходит.

#include <stdio.h>

float harmonic(float n, float har) {

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

    if(n==1) {
        printf("%f\n", har+1.0f);***/* This prints value 1.5000*/***
        return har+1.0f;
    }else{
        harmonic(n-1, (har+(1/n)));
    } 
} 

int main() 
{ 
    printf("%f\n", harmonic(2, 0.0f)); **/* But this prints value nan(Not a  Number)*/**  
    return 0; 
}

Спасибо, Naga

Ответы [ 2 ]

10 голосов
/ 01 марта 2010

Я думаю, что вы хотите сделать:

return harmonic(n-1, (har+(1/n)));
2 голосов
/ 01 марта 2010

Моей первой мыслью было то, что вы почти никогда не должны сравнивать числа с простым равенством, поэтому «if (n == 0)» должно быть «if (n

Но потом я понял, что n должно быть int. Бросьте его на поплавок перед разделением. В сравнении с «n» вы рискуете бесконечной рекурсии.

Подумайте об использовании двойного вместо поплавка.

Ответ Мэтью Флэшена доходит до реальной причины, по которой вы получаете сообщение NaN. Исходный код ничего не возвращает от «else», поэтому вызывающая сторона, вероятно, читает мусор из стека. Следовательно, NaN.

...