一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能性有多少种?请用递归算

  • 递归遍历。靶的范围在0~10,选择一环,累计分数。然后递归进入下一环,重复操作。
  • 到最后一个靶时检查分数是否等于目标分数,是则计数一次,否则返回上一层递归并清除本层打靶的分数;
  • 代码
int shoot(int target, int k){
    //target:目标分数  k:打靶次数
    
    static int n=0;   //记录已打靶次数
    static int sum=0;  // sum:种类计数
    static int score=0; // 当前分数
    static int m, *rec;
    if (!n){        // 只在n为0时执行一次,以后不再执行;
        m = k;      // 将打靶次数赋值给m, 在以后遍历中保持不变
        rec=malloc(sizeof(int)*m); //记录每次打靶分数
    }

    if (k>0){
        for (int i = 0; i <= 10; i++){
            if (n*10-score>10) return 0;    // 丢靶分数大于10分的时候可以直接pass,不可能达到90分了
            rec[n++]=i;
            score+=i;
            if (score==target && n==m) {
                sum++;
                //printf("%d :",sum);
                //for (int i = 0; i < m; i++) printf("%d ",rec[i]);
                //printf("\n");
            }
            shoot(target,k-1);
            n--;
            score-=i;
        }
    }
    if (!n) return sum;
}
posted @ 2022-03-02 14:29  zzzggb  阅读(394)  评论(0编辑  收藏  举报