0

再帰を理解するのを手伝ってくれる人はいますか? 行列を再帰的に読みたいのですが、その方法がよくわかりません。

次の手順で、反復アルゴリズムを再帰アルゴリズムに変換する計画を立てました。

  1. 反復構造 -> 体のどこかで機能の想起が続く場合
  2. 「トップ」から0に戻り、反復的な方法で同じように戻ります(私はこの概念に慣れていないため、アイデアはばかげているかもしれません)

マトリックスを再帰的に読み取る(機能しない)私の機能は次のとおりです。

void read_m(int n,int m)
{
    if(n)
    {
        if(m)
        {
            read_m(n,m-1);
        }
        f>>v[n][m]; 
        read_m(n-1,m);
    }
}

私は間違いが何であるかを知っていますが、私が知らないのは、これをどのように解決すべきかです。前もって感謝します。

PSnmは幅と高さです

4

3 に答える 3

0

まず、if (n) ブロックを移動f>>v[n][m];する必要があります。そうしないと、行全体がインデックス 0 で埋められません。

2番目に、データを行ごとに保持すると仮定すると、再帰に行く前にデータを読み取る必要があります。また、二重読み取りを防ぐために、列全体が読み取られたときにのみ行を減らす必要があります。

void read_m(int n,int m)
{
    f>>v[width-1-n][height-1-m]; //suppose that width and height defined elsewhere
    if(m)
    {
        read_m(n,m-1);
    }
    else if(n)
    {
        read_m(n-1,m);
    }
}

列ごとの場合は、コードで m と n を変更する必要があります。

于 2013-01-03T21:58:04.023 に答える
0

ここで再帰を使用することはおそらく最善の方法ではありませんが、それが必要で、すべての要素に対して 'f' を実行する必要があると仮定すると、n がif(n)ブロック内にあるため 0 の場合は機能しません。

于 2013-01-03T17:32:11.277 に答える
0
#include<fstream>
using namespace std;

ifstream f("recurs.in");
ofstream g("recurs.out");

int a[20][20],n,m;

void read(int i, int j)
{
    if(j>1)
        read(i,j-1);
    else if(i>1) 
        read(i-1,j);
    f>>a[i][j];
}
int main()
{
    int i,j;
    f>>n>>m;
    read(n,m);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
            g<<a[i][j]<<' ';
        g<<endl;
    }
}

働く

于 2013-01-04T22:35:24.793 に答える