用递归计算函数F(n)

时间:2015-05-12 11:15:10

标签: c++ recursion

阅读我不知道它的含义的主题: 函数F(n)在非负整数上确定如下: F(0)= 1; F(1)= 1; F(2n)= f(n); F(2n + 1)= F(n)+ F(n + 1) 通过递归计算F(n)。 和我的代码:

#include<iostream.h>
double TINH_F(int n)
{
    if(n == 0)
   {
      return 0;
   }
    if(n == 1)
    {
      return 1;
    }

     return (F(n+1) - F(2*n+1));
}

3 个答案:

答案 0 :(得分:4)

这显然是不正确的。递归函数调用本身并包含一个停止条件:

#include<iostream.h>
double TINH_F(int n)
{
    if(n == 0)
   {
      return 0;
   }
    if(n == 1)
    {
      return 1;
    }

     // Note the function name change
     return (TINH_F(n+1) - TINH_F(2*n+1));
}

如果传入的整数是负数,你的函数应该怎么做?递归仍然有效吗?或者你应该抛出一个例外来向来电者表明合同已经破裂了吗?

答案 1 :(得分:2)

int f(int n)
{
    if (n<0) return -1; // check if n is positive
    if (n<=1) return 1; // we can catch the first two cases in a single condition

    int half = n/2;

    if (n % 2 == 0) return f(half); // if n is even
    else return f(half) + f(half+1); // if n is odd
}

答案 2 :(得分:1)

你的最后一个案例说

  • F(n)= F(n + 1)+ F(2 * n + 1),对于所有n> 1。 1

如果您仔细阅读该定义,则不会在任何地方提及此案例。

我相信你被参数命名所欺骗 - 你需要四个案例。

让我们分解一下:

  • F(0)= 1(或0 - 您的定义为1,但代码为0 ......)
  • F(1)= 1
  • F(2n)= F(n)
  • F(2n + 1)= F(n)+ F(n + 1)

前两个案件是微不足道的。

第三种情况说,如果论证 - 让我们称之为m - 是偶数,那么结果就是F(m/2)

第四种情况说,如果参数m是奇数,则结果为F(m/2) + F(m/2 + 1) (确认算术为练习。)

在C ++中:

unsigned int TINH_F(unsigned int n)
{
    if(n == 0)
    {
        return 1;
    }
    else if(n == 1)
    {
        return 1;
    }
    else if (n % 2 == 0)
    {
        return TINH_F(n / 2);
    }
    else
    {
        return TINH_F(n/2) + TINH_F(n/2 + 1);
    }
}