-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

この関数の同等のバージョンは、のためにn == 1、およびreturn 0のためにそれ自体を呼び出すことができます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

各反復で、元の値(およびパラメーター)に対していくつかの計算を行い、それを保存します。再帰的にする方法については、大きく2つの選択肢があります。

  1. 最初にすべての反復を実行しn-1、次にそれを返す前にさらに計算を行います。これは、再帰的にすることを最初に行う方が自然なようです。

  2. 最初にこの反復の計算を実行してから、再帰呼び出しで結果を渡して、残りの計算を実行します。これは末尾再帰です(これはn、本当に大きくなり、コンパイラがスタックスペースを節約するために最適化することがわかっている場合を除いて、重要になる可能性は低いです;-)。

再帰は数学的帰納法のようなものです。基本ケースと導入ステップについて考える必要があります。関数では、基本ケースは次のようになります。

  • の場合n = 0、をfunc(n0, n)返します0

そしてあなたのステップは:

  • func(n0, n)を返しますfunc(n0,n-1) * func(n0,n-1) + n0。(関数を1回だけ呼び出して、ローカル変数に保存できます。)

これは、標準の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 に答える