1

関数を再帰関数から、MPIRのライブラリ変数「unsigned__int64」の代わりに「mpz_t」を使用する非再帰関数に変換するのに非常に苦労しています。また、ループをどのように書くべきかについても考えようとしています。再帰的にしたときは簡単でしたが、非再帰的にしようとすると大変でした!

unsigned __int64 exampleFunc( unsigned __int64 a,
                              unsigned __int64 b,
                              unsigned __int64 c )
{
    if( a <= 2 )
        return a + 1;
    if( b <= 4 )
        return b;
    if( c == 3 )
        return c - 1;
    if( b == 5 )
        c += 2;
    // How will I put these into a loop?
    return exampleFunc( a - 1, b - 2, c ) + exampleFunc( 0, b + 1, c - 1 );
};

問題の一部は、mpz_t値を返す関数を記述できないことです。それに値を書き込むことしかできませんでした(ポインターのように)。したがって、このようなものは機能しません:

mpz_t exampleFunc( ... );

つまり、このようなものが機能する可能性があります。

void exampleFunc( mpz_t out, ... );

または、グローバル変数(強くお勧めしません):

mpz_t g_out;
mpz_init( g_out );
void exampleFunc( ... ) { g_out = ? };

ノート:

数値が非常に大きくなるため、配列やベクトルを使用しないようにする必要があります。これが、unsigned__int64からmpz_tに切り替える理由を説明しています。私たちが本当にしなければならないのでなければ...

助けてください、私は本当にストレスを感じています。ありがとう。

4

2 に答える 2

1

gmpに関する質問の場合:gmpxx.hを使用してみてください-mpz_class整数を返すのと同じようにオブジェクトを返すことができます。

mpz_class withgmp( const mpz_class &a, const mpz_class &b, mpz_class c )
{
    if( a <= 2 )
        return a + 1;
    if( b <= 4 )
        return b;
    if( c == 3 )
        return c - 1;
    if( b == 5 )
        c += 2;
    return withgmp( a - 1, b - 2, c ) + withgmp( 0, b + 1, c - 1 );
}

c関数で変更されている可能性があるため、値を渡したことに注意してください。

または、プレーンCを使用する必要がある場合は、次のように、結果の4番目のパラメーターを渡す必要があります。

void withmpz( mpz_t a, mpz_t b, mpz_t c, mpz_t result)
{
     // ... leaving out the boundary conditions
     mpz_t left; mpz_init(left);
     // ... leaving out code for adjusting a,b and c
     withmpz(a,b,c, left);
     mpz_t rightt; mpz_init(right);
     // ... leaving out code for adjusting a,b and c
     withmpz(a,b,c, right);
     mpz_add(result, left, right);
}

mpz_tは値によって渡されるように見えますが、実際には常に参照によって渡されるため、呼び出し後にa、b、cが変更されることに注意してください。withmpz

あなたの質問の2番目の部分であるこれを反復に変換する方法は確かにもっと難しいです。1つの方法は、スタックベースのアルゴリズムに変更することです。このアルゴリズムでは、各反復ステップで、スタックの最上位が追加する必要のある2つの値に置き換えられ、1つがすぐに計算できるようになり、それを最終結果に追加して、これを繰り返します。スタックに値がなくなるまで。

于 2013-03-19T10:54:06.423 に答える
0

ポインターへのポインターが解決策になる可能性があります。ポインターへのポインターを値で渡し、ポインターとそれが指すデータを必要に応じて変更します

于 2013-03-19T10:01:13.697 に答える