C递归不会递归

时间:2015-12-14 20:52:10

标签: c function recursion

我的搜索没有产生任何结果。另外,我的英语非常糟糕,对不起。

所以我的程序应该这样做:

https://i.imgur.com/Ss8Oa2R.png

#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?

我的问题是:

  1. 为什么它不起作用?
  2. 如何输出&#34;错误&#34;而不是&#34; Error0,000000&#34;当输入为&lt; 1?

4 个答案:

答案 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)

  1. 在n <1的情况下,你打印&#34;错误&#34;从被调用的例程中,然后在main中返回0作为printf&#39; d(作为浮点数)。别这么做;-)
  2. 就个人而言,我会检查main中的原始&lt; 1作为调用rec()和printf的替代方法。

    1. 如果您告诉我们它应该生产什么,这将更容易回答。
    2. 但是,我怀疑你的问题与rec()采用整数参数有关,但返回浮点数。如果希望递归函数表现得很好,那么它们的参数和返回类型应该匹配。很可能你的问题是,在某些时候你传递一个大约等于1的小数,它不会被隐式类型转换转换为1。