【问题标题】:Recursive harmonic function returns NaN递归调和函数返回 NaN
【发布时间】:2011-01-22 08:22:27
【问题描述】:

我编写了以下示例代码来查找 N. (1+1/2+1/3+...1/N) 的谐波值。阅读用 BOLD 编写的代码中的 cmets 并帮助我找出发生这种情况的原因。

#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 - 始终确保编译时启用警告(gcc - -Wall,MSVV - /Wall)。编译器会警告您您的问题。

标签: c tail-recursion nan


【解决方案1】:

我想你想做:

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

【讨论】:

    【解决方案2】:

    我的第一个想法是,您几乎不应该将浮点数与简单的相等性进行比较,因此“if(n==0)”应该是“if(n

    但后来我意识到 n 应该是一个 int。在除法之前将其转换为浮点数。由于与“n”的比较意味着你冒着无限递归的风险。

    考虑使用双精度而不是浮点数。

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

    【讨论】:

      猜你喜欢
      • 2016-03-01
      • 2014-01-22
      • 2010-09-21
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      相关资源
      最近更新 更多