将迭代函数转换为递归函数 - C

时间:2014-05-14 00:23:55

标签: c recursion

编辑:不是家庭作业,我试图解决过去几年的考试,只是学习。

我有这个功能,想知道采取什么步骤将它转换成递归的。

这是我的功能,它将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;
}

上述功能可能不是最好的方法。

我很感激这里的任何帮助。

5 个答案:

答案 0 :(得分:5)

我不想给你一个直接的回答,而是向你展示如何做到这一点。 这两个是等价的:

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

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

答案 1 :(得分:1)

将迭代转换为递归时,请查看循环变量。在这种情况下,这是您的变量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);
}

答案 2 :(得分:0)

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

所以

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

答案 3 :(得分:0)

int quadIT(int n)
{
    if ( n == 1 )
    {
      return 1;
    }
    else
    {
       return ((2*n)-1 + quadIT(n-1));
    }
}

答案 4 :(得分:0)

递归函数可以通过以下方式定义

#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

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