1

文字セットから可能なすべての組み合わせを生成する必要があります。

"abcdefghijklmnopqstuvxyz"

生成されたパターンはこのように出力されるはずです。

a
b
...
z
aa
ab
...
az
ba
...

これは 8 の長さで行われますa=>zzzzzzzz。私は C で例を書くことでこの問題に取り組み、これには再帰関数を使用しました。ざっくばらんに書かれていることは承知していますが、ご理解いただけると幸いです。

#include <stdio.h>
#include <string.h>

#define WIDTH 8
char *charset = "abcdefghijklmnopqrstuvxyz";

void charset_r(int width, int pos, char *s)
{
    char buf[WIDTH];
    char *p = charset;

    while(*p!='\0')
    {
        strcpy(buf, s);
        if(pos<width)
        {
            strncat(buf, p, 1);
            printf("%s\n", buf);
            charset_r(width, pos+1, buf);
        }
        p++;
    }
}

int main(void)
{
    int i;
    for(i=0;i<=WIDTH;i++)
        charset_r(i,0,"");
}

私の質問は 2 つあります。

  1. VHDL で再帰を使用する必要がありますか?
  2. そうでない場合、どうすれば問題に取り組むことができますか?

アップデート:

したがって、最終的な目標は、コードを合成し、値をクロック付きポートに出力することです。コメントを読んで理解したように、深さ 2 を超える再帰は悪い考えかもしれないので、再帰なしで他の方法で解決するのがおそらく最善です。

再帰以外の方法でこれについて考えるのに苦労しているので(理解できないようです)、ポインタや提案(コードでさえも!)をいただければ幸いです。

4

2 に答える 2

4

これは、ソフトウェアの問題ではなく、ハードウェアの問題と考えたほうがよいかもしれません。シーケンス内の各文字に 1 つずつ、合計 8 つの状態変数があります。各文字に 5 ビット カウンターを使用すると、すべての文字 [az] に加えて、文字を出力しないタイミングを知るための null 状態 (おそらくゼロ) を表すことができます。

次に、一連の単純なルールに沿ってカウンターをインクリメントするためのある種のステート マシンが必要です。それはあなたの内部状態を駆動します。

次に、カウンターを見て、どの文字を時間内に出力するかを決定する出力プロセスを作成します (または、カウンターがゼロを超えて増加していない場合は、まったく文字を出力しません)。このプロセスは、キャラクターを連続して配置する場合、実行にかかる時間が異なるため、ステート マシンを進めるためのトリガーとして機能する可能性があります。

コードはありません。ここでは、アプローチの概要のみを示します。でも、こうやって考えてみると参考になると思います。

于 2013-01-14T15:00:07.927 に答える
1

文字の各組み合わせは、基数26(シーケンス内の文字数)で記述された数値として扱うことができます。このように、各番号は暗黙的に背後の文字列シーケンスを示します。数値を基数26に変換して、文字列を取得できます。もちろん、文字列の長さごとにこの手順を繰り返す必要があります。アイデアを示すための簡単なコードを作成しました。合成可能な言語サブセットを使用して、VHDLで実装できます。

for( int i = 1 ; i<= 8 ; ++i )
{
    for( int j = 0 ; j < pow(26,i) ; ++j )
    {
           foo( j , i  );
    }
}


void foo( int num , int len)
{
    char digits[len+1];
    // convert num from base 10 to base 26 and fill digits array with proper values in range 0-25
    toBase26(num,digits,len);
    digits[len] = '\0';
    for( int i = 0 ; i < len ; ++i )
    {
              digits[i] = digits[i] + 97 ; //  97 == 'a'
    }
    // do proper thing with your sequence

}
于 2013-01-14T12:00:30.817 に答える