递归谐波函数返回NaN

时间:2010-03-01 15:35:50

标签: c tail-recursion nan

我编写了以下示例代码以找到N的谐波值(1 + 1/2 + 1/3 + ... 1 / N)。阅读BOLD编写的代码中的注释,并帮助我找到原因。

#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; 
}

谢谢, 纳加

2 个答案:

答案 0 :(得分:10)

我想你想做:

return harmonic(n-1, (har+(1/n)));

答案 1 :(得分:2)

我的第一个想法是你几乎不应该将浮点数与简单的相等性进行比较,因此“if(n == 0)”应该是“if(n&lt; = EPSILON)”和“if(n == 1)”应该是“if(n <= 1.0f + EPSILON)”其中EPSILON是一个小的正分数,可能是1.0e-5。取决于您可以依赖多少精度。

但后来我意识到n应该是一个int。在分裂之前把它扔到浮子上。与“n”的比较表明你有无限的递归风险。

考虑使用double而不是float。

Matthew Flaschen的答案得到了你得到NaN信息的真实原因。原始代码不会从“else”返回任何内容,因此调用者可能正在从堆栈中读取垃圾。因此,NaN。