问题1:
解决:
程序设计思想:
首先输入总数n和要提取出的数的个数k,然后在类中定义方法,递归求出阶乘,再分别代入n,k,n-k,赋值给变量,再进行四则运算,求出结果
程序流程图:
程序源代码:
package com.test;
import java.util.Scanner;
public class Tes4 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.print("请输入总数n和要提取出的数k:");
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt(); //输入总数n
int k=scanner.nextInt(); //输入要提取的数的个数k
int jieguo=calculate(n)/(calculate(k)*calculate(n-k));
System.out.println("计算的结果为:"+jieguo);
}
public static int calculate(int n) {
if(n==1 || n==0){
return 1; //递归求出阶乘
}
return n*calculate(n-1);
}
}
运行结果截图:
问题2:
解决:
程序设计思想:
首先先确定行数的数量,输入行数,用两个for循环让最左和最右的值为1,中间的数利用杨辉三角规律下一行的数等于前一行对应位置和前一行对应位置的前一位置之和,第一行和第二行值都为1,然后输出
程序流程图:
程序源代码:
package com.test;
import java.util.Scanner;
public class Tes5 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("请输入行数n:");
Scanner input=new Scanner(System.in);
int n=input.nextInt(); //输入行数
int [][]a=new int[n][n];
for(int i=0;i<n;i++)
{
for(int j=0;j<i+1;j++)
{
if(i==0||j==0||j==i) //外侧为1
a[i][j]=1;
else
a[i][j]=a[i-1][j]+a[i-1][j-1]; //杨辉三角规律下一行的数等于前一行对应位置和前一行对应位置的前一位置之和
System.out.print(a[i][j]+" ");
}
System.out.println();
}
}
}
运行结果截图:
问题3:
解决:
程序设计思想:
首先输入总数n和要提取出的数的个数k,运用的原理,在类中定义方法,递归求出以及,将两个结果相加,进而求出
程序流程图:
程序源代码:
package com.test;
import java.util.Scanner;
public class Tes3 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.print("请输入n和k:");
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int k=scanner.nextInt();
int number=calculateN(n)/(calculateN(k)*calculateN(n-k)); //利用公式计算Ck n
int number1=calculateN(n)/(calculateN(k-1)*calculateN(n-k+1)); //利用公式计算Ck-1 n
System.out.println("计算结果为Ck n+1:"+(number1+number)); // 递归计算Ck n+1
}
public static int calculateN(int n)
{
if(n==1 || n==0)
{
return 1; //递归计算n的阶乘
}
return n*calculateN(n-1);
}
}
运行结果截图:
问题4:
解决:
程序设计思想:
首先先输入盘子的个数,然后设计算法,将n个盘子从A座移动到C座分为3个步骤,1.将A上n-1个盘子借助C座先移到B座 2.把A座上剩下的一个盘子移到C座上 3.将n-1个盘从B座借助A座移到C座上,在定义一个输出移动盘子过程的函数,在移动盘子的函数中调用,再在主函数中调用移动盘子的函数,输出结果
程序流程图:
程序源代码:
package com.test;
import java.util.Scanner;
public class Tes6 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("输入盘子数m");
Scanner input=new Scanner(System.in);
int m=input.nextInt();
System.out.println("步骤为:"); //A,B,C代表三个座
hanoi(m,'A','B','C');
}
public static void move(char x,char y)
{
System.out.println(x+"->"+y);
}
public static void hanoi(int n,char one,char two,char three)
{
if(n==1)
move(one,three); //第一步现将第一个盘子移到第三个座上
else
{
hanoi(n-1,one,three,two); //移动其他盘子
move(one,three);
hanoi(n-1,two,one,three);
}
}
}
运行结果截图:
问题5:
解决:
程序设计思想:
首先输入一个字符串,然后定义一个函数,在此函数中,得到字符串的长度和字符串的第一个字母和最后一个字母,如果它俩不相等,则返回值为0,否则递归函数,判断下两个字母是否一致,直到长度减为1或0,返回值为1,然后在主函数中调用此函数,并判断返回值,若值为1,则输出该字符串是回文字符串,若值为0,则输出该字符串不是回文字符串。
程序流程图:
程序源代码:
package com.test;
import java.util.Scanner;
public class Tes7 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("请输入一个字符串:");
Scanner input=new Scanner(System.in);
String str=input.next();
if(huiWen(str)==1)
System.out.println("该字符串是回文字符串");
else //根据返回值判断是否为回文数
System.out.println("该字符串不是回文字符串");
}
public static int huiWen(String str)
{
int l=str.length(); //字符串长度
if(l==0||l==1)
return 1;
char a=str.charAt(0);
char b=str.charAt(l-1); //查找索引
if(a!=b)
return 0;
return huiWen(str.substring(1, l-1)); / /截取字符串,递归
}
}
运行结果截图: