-1

我有这个代码:

#include <stdio.h>
#include <stdlib.h>


int func(int n0, int n);

int main ()
{
    int n0, n, nFinal=0;
    printf ("Enter constant (n0): ");
    scanf ("%d", &n0);
    printf ("Enter the number of iteractions (n): ");
    scanf ("%d", &n);
    nFinal = func(n0, n);
    printf ("nFinal after %d iteractions is %d: \n", n, nFinal);
    return 0;
}

int func(int n0, int n){
    int i,nFinal=0;

    for (i = 0; i < n; i++){
        nFinal = (nFinal*nFinal) + n0;
    }

    return nFinal;
}

nFinal 在 for 循环中计算。我想实现相同的结果,但执行递归函数。

从我所见,我无法更改函数调用,因为我总是需要起始编号和迭代次数。因此,在第一次迭代之后,程序将不得不再次调用,nFinal = func (n0, n);但由于我需要在每次迭代 nFinal 的计算值时,我将不得不改变它。

是否可以创建递归函数但将函数保持为nFinal = func (n0, n);

有人可以指点我吗?

4

4 回答 4

2

我想你正在寻找这个:

int func(int n0, int n){
    if (n > 1){
        int nFinal = func(n0, --n);
        return (nFinal*nFinal) + n0;
    }
    return n0; // (0*0) + n0
}

请注意,if (n == 1)它返回n0,否则它调用func,将其返回值存储在nFinal并返回(nFinal*nFinal) + n0

此函数的等效版本也可以调用自身 forn == 1return 0for n == 0

于 2012-04-15T10:24:43.037 回答
2

查看您的功能

int func(int n0, int n){
    int i,nFinal=0;

    for (i = 0; i < n; i++){
        nFinal = (nFinal*nFinal) + n0;
    }

    return nFinal;
}

如果 n 为(小于)0,则您的结果为 0。那么 nFinal 的新值是 nFinal^2 + n0 的旧值,因此您得到:

int func(int n0, int n){
    if (n <= 0) return 0;

    int f = func(n0, n-1);
    return f*f + n0;
}
于 2012-04-15T10:25:44.457 回答
0

在每次迭代中,您对原始值(和参数)进行一些数学运算,然后将其存储。关于如何使其递归,您有两种广泛的选择。

  1. 首先进行所有迭代n-1,然后在返回之前对其进行更多数学运算。这似乎更自然地首先使它成为递归。

  2. 首先执行此迭代的数学运算,然后将结果传递给递归调用以执行其余的计算。n这是尾递归(除非会变得非常大并且您知道编译器将对其进行优化以节省堆栈空间,否则这不太重要;-)。

递归就像数学归纳法。你需要考虑你的基本情况和你的归纳步骤。在您的功能中,您的基本情况类似于:

  • 如果n = 0,则func(n0, n)返回0

你的步骤是:

  • func(n0, n)返回func(n0,n-1) * func(n0,n-1) + n0。(您可以只调用一次函数并将其保存到局部变量中。)

这转化为标准的 if-else 构造。看看你到目前为止是否能理解它,如果你卡住了,请告诉我。

于 2012-04-15T10:29:17.170 回答
0
#include <stdio.h>
#include <stdlib.h>

int func_r(int n0, int n, int acc);

int main (){
    int n0, n, nFinal;
    printf ("Enter constant (n0): ");
    scanf ("%d", &n0);
    printf ("Enter the number of iteractions (n): ");
    scanf ("%d", &n);
    nFinal = func_r(n0, n, 0);
    printf ("nFinal after %d iteractions is %d: \n", n, nFinal);
    return 0;
}

int func_r(int n0, int n, int acc){
    if(n == 0)
        return acc;
    return func_r(n0, n-1, acc*acc + n0);
}
于 2012-04-15T10:30:59.233 回答