【问题标题】:Transform iterative function into recursive one - C将迭代函数转换为递归函数 - C
【发布时间】:2014-05-14 16:26:27
【问题描述】:

编辑:不是家庭作业,我正在尝试解决过去几年的一个测试,只是在学习。

我有这个功能,想知道要采取哪些步骤才能将其转换为递归功能。

这是我的函数,它将前 N 个奇数相加:

4^2 = 1+3+5+7 = 16;

int quadIT(int n){

    int x=0;
    int z=1;
    int y=n;

    while(y>0){
        x+=z;
        z+=2;
        y--;
    }

    return x;
}

可能上面的函数不是最好的方法。

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 转换成非迭代函数不是更好吗?总和有一个封闭表达式(前 N 个奇数为 N*N)。递归的规则是什么?建立基本案例;如果输入不是基本情况,则使用更接近基本情况的参数进行递归。
  • 你能详细说明“基本情况”的表达吗?没弄好。
  • 任何(安全)递归函数的一般方案都包含两个部分。一部分是可以简单解决的一个或多个基本案例;另一部分涉及递归。例如,如果 N = 0,则前 N 个奇数之和也为 0。如果 N 大于 0,那么您需要知道如何计算 function(N-1) 并将该结果与N 给出最终结果(对于递归堆栈中的这个级别)。看看下面的答案:他们中的大多数(如果不是全部)都说明了这一点。

标签: c recursion


【解决方案1】:

我不想给你一个直接的答案,而是大致告诉你如何去做。 这两个是等价的:

int foo(int n){
    if (n == 0){
        return something
    } else {
        do something
        return foo(n-1);
    }
}

while(n > 0){
    do something
    n--;
}

【讨论】:

  • +1 不仅是为显然是家庭作业问题“提供代码”,而且仍然提供有用的答案。
  • 这不是作业,是过去一年的考试题。我工作,不能在大学上课,所以我在家里学习我能做的。
  • @HélderMoreira:我知道这有多难。我是一名教授,我一直钦佩有学习动力的学生。祝你好运。
【解决方案2】:

将迭代转换为递归时,请查看循环变量。在这种情况下,这就是您的变量y。使其成为递归函数的参数。接下来,查看在您遍历循环时发生变化的其他变量,并将它们也设为参数。在这一点上,你应该有你的函数的声明:

int quatItRecursive(int y, int x, int z) {
    ...
}

现在您已准备好处理函数体。从基本情况开始,考虑循环未开始时(即n 为零时)得到的结果。在这种情况下,您的函数返回 x。所以现在你有了你的基本情况:

int quatItRecursive(int y, int x, int z) {
    if (y == 0) {
        return x;
    }
    ...
}

要完成主体,请添加递归步骤,即执行循环步骤的调用。现在它是一个递归调用,其参数等于循环的下一次迭代中的变量:

int quatItRecursive(int y, int x, int z) {
    if (y == 0) {
        return x;
    }
    return quatItRecursive(y-1, x + z, z + 2);
}

最后,添加一个带有单个参数的包装器,就像您原来的函数所做的那样:

int quantIT(int n) {
    return quatItRecursive(n, 0, 1);
}

【讨论】:

    【解决方案3】:

    您需要将问题分解为使用其自身的简化版本,再加上一些额外的部分。在这种情况下,前 N 个奇数的总和是前 N-1 个奇数的总和加上您可以计算的数量。

    所以

    int sum_odd(int n)
    {
        if (!n) return 0;
        return sum_odd(n-1) + some_calculation_here;
    }
    

    【讨论】:

      【解决方案4】:
      int quadIT(int n)
      {
          if ( n == 1 )
          {
            return 1;
          }
          else
          {
             return ((2*n)-1 + quadIT(n-1));
          }
      }
      

      【讨论】:

        【解决方案5】:

        递归函数可以这样定义

        #include <iostream>
        
        unsigned long long quadIT( unsigned long long n )
        {
            return n == 0 ? 0 : 2 * n - 1 + quadIT( n - 1 );
        }
        
        int main()
        {
            for ( unsigned long long i = 0; i < 10; i++ )
            {
                std::cout << quadIT( i ) << std::endl;
            }
        }
        

        输出是

        0
        1
        4
        9
        16
        25
        36
        49
        64
        81
        

        考虑到函数参数应该定义为一些无符号整数类型。否则功能会更复杂。

        【讨论】:

          猜你喜欢
          • 2020-08-08
          • 2015-05-30
          • 1970-01-01
          • 2014-03-01
          相关资源
          最近更新 更多