假设输入为4,那么输出应该是所有可能的4个字母单词,字母a到f。一直从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;
}
答案 0 :(得分:4)
我会给你一个提示,让你思考:
4个数字和10个可能数字的可能性有多少(0-9)base ^ digits = 10 ^ 4 = 10000个可能的输出0000-9999,在你的情况下它们将基数= 6(AF)和exp = 4( 4个位置)6 ^ 4 = 1296种组合。
如何制作递归函数? 他们有两个步骤:
基本步骤:当函数没有调用自身时(最终条件),它是标准或条件。
递归步骤:当函数调用自身时,它是条件或条件,它的结果应该更接近基本步骤。
着名的阶乘函数示例,基本步骤是返回1,递归步骤是第二步。
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 ) );
}
}
部分输出:
答案 1 :(得分: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
}
如果你打电话给全部(1,4,'a','f'),它将生成a,b,c,d ... ffff
如果你打电话给所有人(4,4,'a','z'),它将从aaaa生成到zzzz
答案 2 :(得分:-1)
仅仅因为使用十六进制表示法来生成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);}