-2

入力が 4 の場合、出力は文字 a から f までのすべての可能な 4 文字の単語である必要があります。aaaaからffffまでずっと。再帰を使用してこれを行うにはどうすればよいですか?

最初の質問に問題への私の試みを含めなかったことをお詫びします。また、単純な方法 (たとえば for ループなど) を使用する代わりに、なぜ再帰を使用しているのか疑問に思っている人もいます。その理由は、私の教授が for ループを使用してこの問題を解決することを望んでいるためです。

これを行う私の試みは次のとおりです。

void allPossiblilities(int n)
{
     char*result;
     if(Done(result))/*since the last possibility will be all f I am using that as my base case*/
     {
       printf("%s",result);
       return;
     }

 /*This is where the recursive part should go but I am totally lost as to what it should be*/
}

bool Done(result)/*This function just returns true if all the array's index are f*/
{
     int i;
     bool a=true;
     for(i=0;i<=n-1;i++)
        if(result[i]!='f')
           a=false;
}
     return a;
}
4

3 に答える 3

4

次のことを考えさせるヒントを与えます。

4 桁と 10 の可能な数字 (0-9) base^digits = 10^4 = 10000 可能な出力 0000-9999 の可能性はいくつありますか。あなたの場合、base = 6 (AF) と exp = 4 (4 位置) 6^4 = 1296 通りの組み合わせ。

再帰関数はどのように作成されますか? 2 つのステップがあります。

  • 基本ステップ: 関数がそれ自体を呼び出さない場合の基準または条件です (最終条件)。

  • Recursive Step: 関数がそれ自体を呼び出すときの基準または条件であり、その結果は Basic Step により近くなるはずです。

有名な階乗関数の例では、基本ステップは 1 を返すことであり、再帰ステップは 2 番目のステップです。

PD: 私は、あなたが問題を分析し、自分で解決策を見つけられるように、いくつかのツールを提供しようとしています。

再帰的な例

コード:

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

void recurs( int * s );
void print( int * s );

int main( void )
{
    int a[] = { 0, 0, 0, 0 };
    print( a );
    recurs( a );

}

void recurs( int * s )
{
    int i;

    /*Basic Case*/
    if( s[ 3 ] == 5 && s[ 2 ] == 5 && s[ 1 ] == 5 && s[ 0 ] == 5 ){
        print( s );
        printf( "\nAccomplisshed!\n" );
    }

    else{
        s[ 0 ] += 1;
        for( i = 0; i < 3; i++ ){
            if( s[ i ] == 6 ){
                s[ i ] = 0;
                s[ i + 1 ] += 1;
            }
        }
        print( s );
        recurs( s );
    }
}

/* This only prints. */
void print( int * s )
{
    int i; 
    printf( "    " );
    for( i = 3; i >= 0; i-- ){
        printf( "%c", ( s[ i ] + 65 ) );
    }
}

出力の一部: ここに画像の説明を入力

于 2012-11-13T23:38:24.960 に答える
2
 int inc(char *c,char begin, char end){
    if(c[0]==0) return 0;
    if(c[0] == end){   // This make the algorithm to stop at char 'f'
        c[0]=begin;     // but you can put any other char            
        return inc(c+sizeof(char));
    }   
    c[0]++;
    return 1;
}

int all(int a, int n,char begin, char end){
    int i,j;
    char *c = malloc((n+1)*sizeof(char));
    for(i=a;i<=n;i++){
        for(j=0;j<i;j++) c[j]=begin;
        c[i]=0;
        do {
            printf("%s\n",c);
        } while(inc(c,begin,end));
    }
    free(c);
}


int main(void){
    all(4,4,'a','f'); // Generates from 4 letters words starting in aaaa to ffff
}

all(1,4,'a','f') を呼び出すと、 a,b,c,d...ffff が生成されます

all(4,4,'a','z') を呼び出すと、aaaa から zzzz まで生成されます

于 2012-11-14T00:42:59.693 に答える
-1

16進表記を使用してa-f文字を生成するという地獄のために:

#include <stdio.h>
int v(unsigned char* i, unsigned short n) {
  return !n || (*i>=0xa0 && (*i&0xf)>=10 && v(i+1,n-1));
}
void f(unsigned short i) {
  if(i) f(i-1);
  if(v((char*)&i,2)) printf("%x\n",i);
}
int main(){ f((1<<16)-1);}
于 2012-11-14T00:27:36.313 に答える