| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 516 人关注过本帖
标题:[求助]看看这个多重递归!!错在那里.
取消只看楼主 加入收藏
beansboy
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-12-11
收藏
 问题点数:0 回复次数:0 
[求助]看看这个多重递归!!错在那里.

#include <stdio.h>
#include <dos.h>
#define N 4
#define M 5
#define MAX 10
int recursion_n( int n, int m );
int recursion_m( int m);
int is_eq( int m );
void init_env( void );
void list_s( void );
//int get_num( );
void set_num( int i , int f );

char s[N][M] = { 'A', 'B', 'C', 'D', 'E',
0, 0, 'D', 'F', 'G',
0, 0, 'D', 'F', 'G',
'X', 'Y', 'Z', 'D', 'E' }; // 存放等式
int val[128]; // 存放值
int sn[MAX]; // 存放已经使用过的数值


void main( void )
{
int add=0;
init_env( );
recursion_m( M-1);
}
void init_env( void )
{
int x;
for( x = 0; x < 128; x++ )
val[x] = -1;
for( x = 0; x < MAX ; x++ )
sn[x] = -1;

}

void list_s( void )
{
int x, y;

for( x=0; x<N; x++ ){
for( y=0; y<M; y++ ){
printf( "%d", val[ s[x][y] ]);
}
printf("\n" );
}
}


// 置可用标志
void set_num( int i , int f )
{
sn[i] = f;
}

// 判断是否相等
int is_eq( int m )
{
int x, sum=0, p=0, q=0,add,i,t=0;
for( x =0; x< N -1; x++ )
sum += val[ s[x][m] ];
if(m>3) // 取进位值
{
add=t;
}
if(m<4){
for(i=0;i<N-1;i++)
t+=val[s[i][m+1]];
add=t/MAX;;
}
sum += add;
q = sum % MAX; // 取余
if((sn[ q ] == -1)&&(val[ s[x][m] ] == -1)&& (val[s[0][m]]!=q)&&(s[0][m]!=s[x][m])) {
val[ s[x][m] ] = q;
set_num( q, 1 );
return( 0 );
}
if(( q == val[ s[0][m] ] )&&(val[s[x][m]]!=-1)&&(sn[q]!=-1)&&(s[0][m]==s[x][m]) ) { // 相等
val[s[x][m]]=q;
set_num(q,1);
return(0);
}
return( -1 );
}

// 递归N
int recursion_n( int n, int m )
{
int x;

// 判断是否已经结束了
if( n >= N -1 ){ // 判断等式是否相等
if( !is_eq( m ) ) {
recursion_m( m-1);
}
return( 0 );
}
if(val[s[n][m]]==-1){
if(s[n][m]==0){
val[s[n][m]]=0;
val[s[n+1][m]]=0;
recursion_n( n+2, m );
}
else
{
for( x=0; x < MAX; x++ ){
if(sn[x]==-1){ // 如果没有数,则置数
val[ s[n][m] ] = x ;
val[s[n+1][m]]=x;
set_num( x, 1 ); // 置已用标
recursion_n( n+2, m );
set_num( x, -1 ); // 置未用标志 //置未用标志,继续循环
val[ s[n][m] ] = -1;
}
}
}
}
else
{
val[s[n+1][m]]=val[s[n][m]];
recursion_n( n+2, m );
}
return(0);
}

// 递归M
int recursion_m( int m )
{
int x, n=0; // 判断是否已经结束了
if( m < 0 )
{
list_s( );
return( 0 );
}
for( x=0; x < MAX; x++ ) // 如果没有数,则置数
{
if((sn[x]==-1)&&(val[s[n][m]]==-1))
{
val[ s[n][m] ] = x ;
set_num( x, 1 ); // 置已用标志
recursion_n( n+1, m );
val[ s[n][m] ] = -1; //置未用标志,继续循环
set_num( x, -1 ); // 置未用标志
}
}
return(0);
}
-----------------------------------------------------------------------------------------------------------------------
不知道会不会溢出!!!!!!!

搜索更多相关主题的帖子: 递归 
2006-12-11 10:09
快速回复:[求助]看看这个多重递归!!错在那里.
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042226 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved