【问题标题】:C recursion does not recurseC递归不递归
【发布时间】:2015-12-14 20:52:09
【问题描述】:

我的搜索没有产生任何结果。另外,我的英语很差,很抱歉。

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

#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时,它只输出添加的数字

return 1/2*rec(n-1)+4;

在这种情况下,它输出 4。为什么?是rec(n-1) == 0吗?

我的问题是:

  1. 为什么不起作用?
  2. 当输入为

【问题讨论】:

  • @MarcB 在这种情况下他实际上返回 0,因为函数一直到最后
  • 啊,是的。糟糕的缩进让我失望了......
  • 你的函数原型是float rec();,它不接受任何参数。您应该将其声明为 float rec(int);(或任何适合的数据类型)
  • 另外你应该选择一本书,看看如何用现代 C 编写函数接口。你的原型和rec 的定义都应该有参数的类型,
  • @Olipro,C 中的函数声明中没有空列表实际上意味着该函数可以接收任意数量和类型的参数。

标签: c function recursion


【解决方案1】:

整数除法!

这里,

return 1/2*rec(n-1)+4;

1/2 将产生 0 由于整数除法。所以最终结果总是4

您可以这样做:

return 1.0/2*rec(n-1)+4;

这将确保计算以double 发生。

您可能还只想添加return 0;在if (n&lt;1) 的情况下,将函数definitio 更改为:

float rec(int n) {... }

如果您没有为 n 指定 type,则在 C99 之前的版本中默认为 int。但在 C99 和 C11 中不再是这种情况。

【讨论】:

  • 既然除法有一个完全可以表示的结果,为什么不直接说0.5*rec(n-1)+4;呢?
  • @JohnBollinger 当然。给猫剥皮的方法不止一种。但我没有看到使用0.5 的任何明显优势。一个体面的编译器无论如何都会在编译时计算它。
  • 可以肯定的是,这两个变体意味着相同的事情,并且可能(但不一定)编译器会为两者生成相同的代码。但是带有0.5 的版本更易于阅读和理解,并且不太容易让无知的初级程序员稍后将其改回原来的整数除法形式。
【解决方案2】:

问题主要是类型问题:试试

return 1.0/2.0*rec(n-1)+4

告诉编译器,您在计算期间需要浮点运算。否则,将执行整数除法并在之后转换为浮点数

Fwiw:你不会为此使用递归,与 c 中的递归版本相比,迭代就足够了,更容易理解,性能更好并且需要更少的资源。

【讨论】:

    【解决方案3】:

    我想给你第二个问题的答案。

    rec 的返回值需要一个缓冲区。

    所以,

    float answer = rec(w);
    if (NOTHING_HAPPENED)
        print("%f", answer);
    

    这行得通!

    【讨论】:

      【解决方案4】:
      1. 在 n

      就个人而言,我会在 main 中检查原始文件是否为

      1. 如果您告诉我们它应该产生什么,这将更容易回答。

      但是,我怀疑您的问题与 rec() 采用整数参数但返回浮点数有关。如果您希望递归函数表现良好,它们的参数和返回类型应该匹配。您的问题很可能是在某些时候您传递了一个大约等于 1 的小数,而隐式类型转换不会将其转换为 1。

      【讨论】:

        猜你喜欢
        • 2015-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-11
        • 1970-01-01
        相关资源
        最近更新 更多