我的搜索没有产生任何结果。另外,我的英语非常糟糕,对不起。
所以我的程序应该这样做:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
float rec();
int main()
{
setlocale(LC_ALL,"");
int w;
scanf("%d",&w);
printf("%f",rec(w));
return 0;
}
float rec(n)
{
if (n<1)
{
printf("Error");
}
else if (n==1)
{
return 6;
}
else if (n>1)
{
return 1/2*rec(n-1)+4;
}
return 0;
}
当输入为1时,它输出6,正如它应该的那样。
当输入<1时,它输出&#34; Error0,000000&#34;。
当输入> 1时,它只输出
中添加的数字return 1/2*rec(n-1)+4;
在这种情况下,它输出4.为什么? rec(n-1)== 0?
我的问题是:
答案 0 :(得分:6)
整数师!
下面,
return 1/2*rec(n-1)+4;
由于整数除法, 1/2
将产生0
。所以它总是4
作为最终结果。
相反,你可以这样做:
return 1.0/2*rec(n-1)+4;
将确保计算以double
发生。
您可能只想添加return 0
;在if (n<1)
案例中,将函数definitio更改为:
float rec(int n) {... }
如果您没有为n
指定类型,则在C99之前默认为int
。但在C99和C11中不再是这种情况。
答案 1 :(得分:1)
问题主要是类型问题:尝试
return 1.0/2.0*rec(n-1)+4
告诉编译器,你想在计算过程中进行浮点运算。否则,执行整数除法并将其转换为之后的。
Fwiw:你不会为此使用递归,迭代完全就足够了,比c中的递归版更好理解,表现更好,所需资源更少。
答案 2 :(得分:0)
我想问你第二个问题的答案。
你需要一个缓冲区来表示rec的返回值。
所以,
float answer = rec(w);
if (NOTHING_HAPPENED)
print("%f", answer);
这会有效!
答案 3 :(得分:0)
就个人而言,我会检查main中的原始&lt; 1作为调用rec()和printf的替代方法。
但是,我怀疑你的问题与rec()采用整数参数有关,但返回浮点数。如果希望递归函数表现得很好,那么它们的参数和返回类型应该匹配。很可能你的问题是,在某些时候你传递一个大约等于1的小数,它不会被隐式类型转换转换为1。