问题:一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能行有多少种? 用递归实现
分析:这是一个考察递归的问题,每开一枪都在0环到10环之间,那么这样就需要一个循环来把每一枪的每一种情况考虑进去;然后总分要达到90分,把10枪中每一枪的情况加起来所得的和达到90分的时候就可以了.如果用循环,那么程序就比较罗嗦了,这里使用递归来实现.注意还有一种情况要考虑:当你打了几枪后,如果后面剩下的几枪即使每一枪打10环也得不到90分的时候,这个时候程序再往下走就没有意义了.程序就要返回.
这里给出该程序的清单:
#include <stdio.h>
int store[10]; int sum; int main() { shoot(90,10); printf("It has %d compound",sum); }
shoot(int socre,int num) { int i; if(socre<0||socre>num*10) //如果得分小于0或后面的即使所有都是10环也得不到90分 return; //那么就退出 if(num==1) { store[10-num]=socre; prints(); return; } for(i=0;i<=10;i++) { store[10-num]=i;
shoot(socre-i,num-1); } }
int prints() { int i; for(i=0;i<10;i++) { printf("%d",store[i]); } sum++; printf("/n"); }
|