求指教

leader_tk 2018-09-28 03:00:01
Java用递归编写的 一个射击运动员打靶,靶一共有 10 环,连开 6 枪打中 45 环的可能性有多少种?
...全文
435 9 打赏 收藏 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
CivKeeper 2018-10-11
  • 打赏
  • 举报
回复
class OutPut{
private int sum = 0;

public void SetSum() {
sum++;
}

public int OutSum() {
return sum;
}
}

// 设计计算方法
class Calculate extends OutPut{
public void ComPut(int score,int num) {
if (score < 0 || score > (num + 1) * 10)
return;

if (num == 0) {
SetSum();
return;
}

for (int i = 0;i <= 10;++i)
ComPut(score-i,num-1);
}
}

public class SheBar {
public static void main(String[] args) {

Calculate a = new Calculate();

a.ComPut(45, 5);

System.out.println(a.OutSum());
}
}
verejava 2018-10-01
  • 打赏
  • 举报
回复
数据结构算法 之 递归算法 http://www.verejava.com/?id=173208157961122
leader_tk 2018-09-30
  • 打赏
  • 举报
回复
请问一下做这种题的思想
qq_39936465 2018-09-30
  • 打赏
  • 举报
回复
抱歉刚刚有部分代码写错了,下面是修正版

public class test{

static int count=0;

public static void main (String[] args){
sum(0,6);
System.out.println("count="+count);
}
public static void sum(int x,int round){
int s=x;
if (round>0){
for (int i=0;i<11;i++) {
x = s + i;
if(x==45){
count++;

}else {
if(x<45){
sum(x,round-1);
}else
continue;
}
}
}
}
}

count= 14748
qq_39936465 2018-09-30
  • 打赏
  • 举报
回复
递归 基本就是自身调用自身形成 循环嵌套,先看清变化量 ,把循环相同部分提取出来,然后对自身进行变量传递。

本题 每轮可能得分是固定的,变化的是到上轮为止的总得分和轮次。
qq_39936465 2018-09-30
  • 打赏
  • 举报
回复
public class test{

static int count=0;

public static void main (String[] args){
sum(0,6);
System.out.println("count="+count);
}
public static void sum(int x,int round){
int s=x;//保存上轮数字
if (y>0){ //判断轮次没有耗尽
for (int i=0;i<11;i++) { //每轮可能得分0-11
x = s + i; //到本轮为止得分
if(x==45){
count++;
sum(x,y-1); 下轮零环的可能性
}else {
if(x<45){
sum(x,y-1); //分数不足开始下轮射击
}else
continue; //分数超过的话跳过
}
}
}
}
}

汉森cd 2018-09-28
  • 打赏
  • 举报
回复
优化版

class Test {
private int mGoalScores = 45; // 目标值
private int mRoundNum = 6; // 轮数
private int mMinScore = 0; // 最低得分
private int mMaxScore = 10; // 最高得分
private int[] mScoresArr; // 得分记录
private int mMethodNum = 0; // 可能得到目标值的情况数
private int mSum = 0; // 某一轮的分数总和

public Test(){
mScoresArr = new int[mRoundNum];
}

private boolean continueNextRound(int round) {
if (mRoundNum == round) {
if (mGoalScores == mSum) {
for (int ii=0; ii<mRoundNum; ii++) {
System.out.print(mScoresArr[ii] + " ");
}
System.out.println("");

mMethodNum++;
}
return false;
}

return true;
}

private void getRoundScore(int round) {
if (false == continueNextRound(round)) {
return;
}

for (int ii=mMinScore; ii<=mMaxScore; ii++) {
mScoresArr[round] = ii;
mSum += mScoresArr[round];
getRoundScore(round+1);
mSum -= mScoresArr[round];
}
}

public void startCal() {
getRoundScore(0);
System.out.println("Possible cases: " + mMethodNum);
}
}

引用 2 楼 rabbit0404 的回复:
这种问题用数学方法解决了直接print了,如果非要用递归,如下:
class Test {
private int mGoalScores = 45;
private int mRoundNum = 6;
private int mMinScore = 0;
private int mMaxScore = 10;
private int[] mScoresArr;
private int mMethodNum = 0;

public Test(){
mScoresArr = new int[mRoundNum];
}

private boolean checkSum() {
int sum = 0;
for (int ii=0; ii<mRoundNum; ii++) {
sum += mScoresArr[ii];
}

return sum==45;
}

private void printArr() {
for (int ii=0; ii<mRoundNum; ii++) {
System.out.print(mScoresArr[ii] + " ");
}

System.out.println("");
}

private void getRoundScore(int round) {
if (mRoundNum == round) {
if (true == checkSum()) {
printArr();
mMethodNum++;
}
return;
}

for (int ii=mMinScore; ii<=mMaxScore; ii++) {
mScoresArr[round] = ii;
getRoundScore(round+1);
}
}

public void startCal() {
getRoundScore(0);
System.out.println("Possible cases: " + mMethodNum);
}
}
总结果有14748可能。
给分。
汉森cd 2018-09-28
  • 打赏
  • 举报
回复
这种问题用数学方法解决了直接print了,如果非要用递归,如下:
class Test {
private int mGoalScores = 45;
private int mRoundNum = 6;
private int mMinScore = 0;
private int mMaxScore = 10;
private int[] mScoresArr;
private int mMethodNum = 0;

public Test(){
mScoresArr = new int[mRoundNum];
}

private boolean checkSum() {
int sum = 0;
for (int ii=0; ii<mRoundNum; ii++) {
sum += mScoresArr[ii];
}

return sum==45;
}

private void printArr() {
for (int ii=0; ii<mRoundNum; ii++) {
System.out.print(mScoresArr[ii] + " ");
}

System.out.println("");
}

private void getRoundScore(int round) {
if (mRoundNum == round) {
if (true == checkSum()) {
printArr();
mMethodNum++;
}
return;
}

for (int ii=mMinScore; ii<=mMaxScore; ii++) {
mScoresArr[round] = ii;
getRoundScore(round+1);
}
}

public void startCal() {
getRoundScore(0);
System.out.println("Possible cases: " + mMethodNum);
}
}
总结果有14748可能。
给分。
nayi_224 2018-09-28
  • 打赏
  • 举报
回复

import java.util.Arrays;

public class Test56 {
	static int nn = 0;
	public static void main(String[] args) {
		aa(0, 0, new int[6]);
		System.out.println(nn);
	}
	public static void aa(int total, int num, int[] arr){
		if(num <= 6 && total == 45){
			nn++;
			System.out.println(Arrays.toString(arr));
			return;
		}
		
		if(num >= 6 || total > 45)
			return;
		
		int i = 11;
		while(i-- > 0){
			int[] temp = new int[6];
			System.arraycopy(arr, 0, temp, 0, 6);
			temp[num] = i;
			aa(total + i, num + 1, temp);
		}
	}
}

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧