关于C语言的递归问题!!!~~~

我有几个题目想麻烦高人给看下,这几个题目都是用层层循环解决的类似问题,但我有个同学说他用的是递归和全局变量做的,而且确实做对了。关于用后者的方法解决这些问题我完全没思路,所以麻烦高人指点,给思路就好,谢谢了!!!~~~~~

一,4 名专家对4款赛车进行评论:

A说:2号赛车是最好的。

B说:4号赛车是最好的。

C说:3号不是最佳赛车。

D说:B说错了。

事实上只有一款赛车最佳,且只有一名专家说对了,其他三人都说错了,请编程输出最佳赛车的车号,以及哪位专家说对了。

二,5位跳水高手将参加10米高台跳水决赛,有好事者让5人据实力预测比赛结果。

A选手说:B第二,我第三;

B选手说:我第二,E第四;

C选手说:我第一,D第二;

D选手说:C最后,我第三;

E选手说:我第四,A第一。

决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错。请编程输出比赛的实际名次。

#include<stdio.h>
void main( void )
{
int Best_Car( int count ) ;
int i = Best_Car( 0 ) ;
printf( "The Best car is %d\n" , i ) ;
if( ! ( i - 2 ) )
printf( "A is right!\n" ) ;
else if( ! ( i - 4 ) )
printf( "B is right!\n" ) ;
else if( !! ( i - 3 ) )
printf( "C is right!\n" ) ;
else if( !! ( i - 4 ) )
printf( "D is right!\n" ) ;
while( 1 ) ;
}
int Best_Car( int count )
{
if( 1 == ! ( count - 2 ) + ! ( count - 4 ) + !!( count - 3 ) + !!( count - 4 ) )
{
return count ;
}
else
{
count ++ ;
return Best_Car( count ) ;
}
}
visual studio 2005 编译通过
第二题做法与第一题相同 ,只是在最后的判断条件处多加了一点而已 ,人数变为5而已,核心递归思想没有变化 , 就不再重复做了 , 不需要全局
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-05-01
大概思想是:
do_judge(a,b,c,d)
{
if(check(a,!b,!c,!d)
{
return 1;//find solution
}

return do_judge(b,c,d,a);
}
check函数,满足条件返回为真,否则返回假!
函数do_judge的参数是每个假设条件

当为do_judge(a,b,c,d)时,
check(a,!b,!c,!d)代表:
a为真,b、c、d为假

当为do_judge(b,c,d,a)是
b为真,c、d、a为假

调用do_judge的堆栈情况
do_judge(a,b,c,d)
|
+do_judge(b,c,d,a)
|
+do_judge(c,d,a,b)
|
+do_judge(d,a,b,c)
这些调用中,最终会有一个返回一个真,所有不一定这些调用都会发生。
第2个回答  2011-05-01
首先要用程序语言写出来,那么你得先自己知道思路,第一题:抓主要矛盾,B和D的回答是明显的矛盾B说:4号赛车是最好的。D说:B说错了。两者回答只可能其中一人回答正确,那么这时候就假设,先假设B说对了,那么事实上的最好的车就是4号,再来推敲其他人的回答,看C说:3号不是最佳赛车。,那么C说对了,因为假设出来的最好车就是4号,不是3号,那么此时就有2人说对了,舍弃掉此假设。
B错就说明D说对了!D说:B说错了。言下之意就是4号赛车不是最好,那么此时又存在1,2,3号是最好的赛车的可能性,我们再来推敲每个人说的话,A说:2号赛车是最好的。判错掉A的回答,如果A说对就有2个人说对了,相应把2号车排除掉了。C说:3号不是最佳赛车。判错掉C的回答,同理C不能正确,那么相应的答案就是3号才是最号的赛车。
结果就是,4个专家中D说对了,3号车是最好的,至于代码自己完善吧
第3个回答  2011-05-01
受楼上的启发,写了第二题的答案,C-FREE测试通过:
#include<stdio.h>
int used[5];
int p[5];
int ii[5]={1,2,3,4,5};
void main( void )
{
int* Rank(int*);
void perm(int);
perm(0);
}
int* Rank(int * p){
/* for(int kk=0;kk<5;kk++)
printf("%d",p[kk]);
printf("\n");*/
if((1==!(p[1]-2)+!(p[0]-3))&&
(1==!(p[1]-2)+!(p[4]-4))&&
(1==!(p[2]-1)+!(p[3]-2))&&
(1==!(p[2]-5)+!(p[3]-3))&&
(1==!(p[4]-4)+!(p[0]-1))){
printf("最终名次为:");
for(int kk=0;kk<5;kk++)
printf("%d",p[kk]);
printf("\n");
}
}

void perm(int l) { //当前排第l个数
int i;
for (i=0; i<5; i++) {
if (!used[i]) { //如果某个数没排过
p[l] = ii[i]; //就排它
used[i] = true;
if (l==4)
Rank(p);
else perm(l+1); //如果数够了,则输出,否则排下一个
used[i] = false;
}
}
}
楼主也可以参考http://apps.hi.baidu.com/share/detail/15787681
第4个回答  2011-05-01
上面的楼主我对这个问题也很感兴趣,要是有人回答了麻烦转告我一下···谢了!
相似回答