我正在尝试制作一个程序,它给出了系列1的总和!+2 / 2!+3/3!........... n / n! 这是我的代码。
#include "stdafx.h"
#include<conio.h>
#include <stdio.h>
#include <stdlib.h>
int n;
double sumseries(double sum, double count)
{
double fac = 1, i;
for (i = 1; i <= count; i++)
fac = fac*i;
sum += (count++ / fac);
if (count <= n)
sumseries(sum, count);
else {
printf("sum of series is:%lf", sum);
return sum;
}
}
int main()
{
printf("enter the limit");
scanf_s("%d", &n);
double z = sumseries(0,1);
printf("\n%lf",z);
system("pause");
}
现在,当我们从sumseries()函数打印sum时,会打印正确的值。但是在下一行中,我们返回总和并将其保存在main()函数中的z变量中。当我们尝试打印该值时,它会显示-nan(ind)
我的问题不是如何解决这个问题或如何使这个程序工作。我要问的是上面代码中导致此问题的原因。为什么没有返回正确的值。
答案 0 :(得分:4)
在sumseries
函数中,并非所有流控制路径都返回值。
你至少应该写
if (count <= n)
return sumseries(sum, count);
而不是
if (count <= n)
sumseries(sum, count);
答案 1 :(得分:1)
您的编译器应该给出警告,甚至是问题的错误。如果没有,请将警告级别提高。
你有一个递归函数sumseries,但是你不会从导致结束的所有路径返回一个值。因此,返回值是不确定的。
递归函数不会返回一次,您必须从每一步返回。在这种情况下,您返回最后一个值,但之前对该函数的调用会将其抛出。你需要继续回来。因此,您需要使用
return sumseries(sum, count);
继续将值返回到上一步。
答案 2 :(得分:0)
sumseries()中的控制流可能会到达其结尾并返回未定义的值。您需要在代码中使这种情况变得不可能。您可能想要使用此声明:
if (count <= n)
return sumseries(sum, count);
而不仅仅是
if (count <= n)
sumseries(sum, count);