排列组合算法实验中递归和非递归算法

#define PHONE_NUMBER_LENGHT 7
char KeyChar[7][3]  = {
    
{'0''0''0'},
    
{'1''1''1'},
    
{'a''b''c'},
    
{'d''e''f'},
    
{'g''h''i'},
    
{'j''k''l'},
    
{'m''n''o'},
    
//{'r', 's', 't'},
    
//{'u', 'v', 'w'},
    
//{'#', '#', '#'}

}
;

void DoPrintTelephoneWords(int phoneNum[], char result[], int pos); 

char GetKeyChar(int num, int pos)
{
    
return KeyChar[num][pos-1];
}

/*递归
void PrintTelephoneWords(int phoneNum[])
{
    char result[PHONE_NUMBER_LENGHT+1];
    result[PHONE_NUMBER_LENGHT] = '\0';

    DoPrintTelephoneWords(phoneNum, result, 0);

  printf("个数 :%d \n", num);
}
*/

/*非递归*/
void PrintTelephoneWords(int phoneNum[])
{
    
char result[PHONE_NUMBER_LENGHT+1];
    result[PHONE_NUMBER_LENGHT] 
= '\0';

    
    
for(int i=0; i<PHONE_NUMBER_LENGHT; i++)
    
{
        result[i] 
= GetKeyChar(phoneNum[i], 1);
    }


    
while(1)
    
{
        printf(
"%s \n", result);
        num
++;

        
for(int j=PHONE_NUMBER_LENGHT-1; j>=-1; j--)
        
{
            
if(j==-1)
            
{
                    printf(
"个数: %d \n", num);
                
return;
            }


            
if(GetKeyChar(phoneNum[j], 3)==result[j]||phoneNum[j]==0||phoneNum[j]==1)
                result[j] 
= GetKeyChar(phoneNum[j], 1);
            
else if(GetKeyChar(phoneNum[j], 1)==result[j])
            
{
                result[j] 
= GetKeyChar(phoneNum[j], 2);
                
break;
            }

            
else if(GetKeyChar(phoneNum[j], 2)==result[j])
            
{
                result[j] 
= GetKeyChar(phoneNum[j], 3);
                
break;
            }


        }

    }


}



void DoPrintTelephoneWords(int phoneNum[], char result[], int pos)
{
    
int i=1;
    
if(pos == PHONE_NUMBER_LENGHT)
    
{
        printf(
"%s \n", result);
        printf(
"pos:%d \n", pos);
        num
++;
        
return
    }


    
for(i=1; i<=3; i++)
    
{
        result[pos]
=GetKeyChar(phoneNum[pos], i);
        DoPrintTelephoneWords(phoneNum, result, pos
+1);
        
if(phoneNum[pos]==0||phoneNum[pos]==1)
        
{
            
return;
        }

    }

}

int main(int argc, char* argv[])
{
     
int phoneNum[PHONE_NUMBER_LENGHT];
    
    printf(
"请依次输入7位的号码:\n");
    
for(int i=0; i<PHONE_NUMBER_LENGHT; i++)
        scanf(
"%d"&phoneNum[i]);
    printf(
"生成的word表:\n");

    PrintTelephoneWords(phoneNum);
    getchar();
    
return 0;
}


输入为“1234567”,两种算法运行结果不一样,非递归算法共产生243中组合,递归产生729种组合。怪异之处在于,非递归产生组合的数目不正确(应该是243x3=729),递归算法产生的数目正确了,但每种组合都重复了三次,调试多次仍找不到问题所在,但得到了一些结论:
1从递归算法数目正确但有重复猜测为最后一层递归时最后的字符给的是0值,
2用递归算法,将PHONE_MENBER_LENGHT定义成不同的值发现,6和7时结果相同,小于7的时候都是正确的。
在思考零值从何而来时,认为数值唯一的来源在GetKeyChar,进而问题应该在KeyChar数组身上,突然想到KeyChar为全局数据,google几下找到了一些信息表示全局数据区可能是已经初始化好了的区块,那么如果数组越界了的话GetKeyChar就会给出零值,种种迹象表明GetKeyChar嫌疑最大,观察n久时间后,丫的!找到了,问题在这句“return KeyChar[num][pos-1];”,如果num为7时就会越界!至于为什么非递归算法数据少的原因在于,
if(GetKeyChar(phoneNum[j], 3)==result[j]||phoneNum[j]==0||phoneNum[j]==1)
                result[j] 
= GetKeyChar(phoneNum[j], 1);
由于越界,号码最右为7所以上面个if语句每次都会成功,这样等于过滤掉了。

posted on 2011-09-26 13:53 lxw 阅读(1088) 评论(0)  编辑 收藏 引用 所属分类: c++-游戏

<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论