1、递归求解阶乘函数
阶乘函数可递归定义为:
代码:
public class Main1 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner input=new Scanner(System.in);
while(input.hasNext()) {
int n=input.nextInt();
System.out.println(function(n));
}
}
public static int function(int n) {
if(n==0) {
return 1;
}
else{
return n*function(n-1);
}
}
}
2、Fibonacci数列
数列可递归定义为:
代码:
public class Main1 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner input=new Scanner(System.in);
while(input.hasNext()) {
int n=input.nextInt();
System.out.println(function(n));
}
}
public static int function(int n) {
if(n==0||n==1) {
return 1;
}
else{
return function(n-1)+function(n-2);
}
}
}
3、整数划分问题
在正整数n的所有不同的划分中,将最大加数n1不大于m的划分个数记作q(n,m);
整数划分可递定义为:
代码:
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner input=new Scanner(System.in);
while(input.hasNext()) {
int n=input.nextInt();
System.out.println(function(n,n));
}
}
public static int function(int n,int m) {
if(n<0||m<0) {
return 0;
}
if(n==1||m==1) {
return 1;
}
if(n<m) {
return function(n,n);
}
if(n==m) {
return 1+function(n,n-1);
}
else{
return function(n,m-1)+function(n-m,m);
}
}
}
备忘录法解决整数划分问题:
代码:
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner input=new Scanner(System.in);
while(input.hasNext()) {
int n=input.nextInt();
int a[][]=new int [n][n];
System.out.println(function(n,n,a));
}
}
public static int function(int n,int m,int a[][]) {
if(n<1||m<1) {
return 0;
}
if(n==1||m==1) {
return 1;
}
if(n==m) {
if(a[n-1][n-2]==0) {
a[n-1][n-2]=function(n,n-1,a);
}
return 1+a[n-1][n-2];
}
if(n>m) {
if(a[n-1][m-2]==0) {
a[n-1][m-2]=function(n,m-1,a);
}
if(a[n-m-1][m-1]==0) {
a[n-m-1][m-1]=function(n-m,m,a);
}
return a[n-1][m-2]+a[n-m-1][m-1];
}else
return 0;
}
}
4、汉诺塔问题
代码:
public class Main {
static int step;
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner input=new Scanner(System.in);
while(input.hasNext()) {
int n=input.nextInt();
step=0;
hanoi(n,'A','B','C');
System.out.println();//换行
}
}
public static void move(int n,char a,char b) {
System.out.println("第"+(++step)+"步:"+n+"号盘从"+a+"柱移至"+b+"柱");
}
public static void hanoi(int n,char A,char B,char C) {
if(n>0) {
hanoi(n-1,A,C,B);//把n-1个盘子从A柱借住C柱移动到B柱
move(n,A,C);
hanoi(n-1,B,A,C);
}
}
}
5、九数组分数问题
问题表述:1, 2, 3...9 这九个数字组成一个分数,其值恰好为1/3,要求每个数字出现且只能出现一次,如何组合?编写程序输出所有的组合。
输入:无
输出:输出所有的结果,如果有多个,每条结果占一行。
结果的格式 : xxxx/xxxxx ,按照分子从小到大的顺序输出。
代码:
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a=new int[10];
for(int i=1;i<=9;i++) {
a[i]=i;
}
Main main1=new Main();
main1.t(a, 1, 9);
}
public static void test(int [] a) {
//四位数除五位数
int x=(a[1]*1000+a[2]*100+a[3]*10+a[4])*3;
int y=(a[5]*10000+a[6]*1000+a[7]*100+a[8]*10+a[9]);
if(x==y) {
for(int i=1;i<=9;i++ ) {
System.out.print(a[i]);
if(i==4) {
System.out.print("/");
}
}System.out.println();
}
}
public static void t(int [] a,int k,int m) {
if(m==k){
test(a);
}
for(int i=m;i>=k;i--) {
int x;
x=a[m];
a[m]=a[i];
a[i]=x;
t(a, k, m-1);
int y;
y=a[m];
a[m]=a[i];
a[i]=y;
}
}
}