码迷,mamicode.com
首页 > 其他好文 > 详细

02方法-作业01-递归练习

时间:2017-10-13 23:54:10      阅读:415      评论:0      收藏:0      [点我收藏+]

标签:==   作业   分享   substring   三角形   代码   设计思想   .com   练习   

一:使用计算机计算组合数

(1)使用组合数公式用n!来计算

程序设计思想:利用递归的思想来定义方法jc()来及计算n!,并根据组合数公式C(m,n)=n!/m!*(n-m),定义一个变量sum,

用来输出结果,将n,m,n-m,代入jc(),输出结果。

程序流程图:

 

 

技术分享

程序源代码:

import java.util.Scanner;
public class Zuheshu{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入两个数:");
int k =sc.nextInt();
int n =sc.nextInt();
int sum =jc(n)/(jc(k)*jc(n-k));
System.out.println(sum);


}


private static int jc(int s) {
if(s==0||s==1)
return 1;
else{
return s*jc(s-1);
}
}
}

程序测试截图:

技术分享

(2)使用递归的方法用杨辉三角来计算组合数

程序设计思想:

定义一个二维数组T存储杨辉三角形,循环赋值构造杨辉三角形:并使T[i][0] = 1,T[i][i] = 1,其中每个T[i][j] =T[i - 1][j - 1] + T[i - 1][j]。所以C(m,n)=T[n][k],

最后输出结果。

程序流程图:

技术分享

程序源代码:

import java.util.Scanner;

public class zuuheshu {

public static void main(String[] args) {

System.out.print("请输入组合数中的底数m:");

Scanner sc = new Scanner(System.in);

int m = sc.nextInt();

System.out.print("请输入组合数中的阶数n:");

int n= sc.nextInt();

System.out.println("该组合数的结果为:"+T(m,n));

}

public static int T(int m,int n){

int[][] S = new int[m + 1][m + 1];

S[0][0] = 1;

for(int i = 0;i < m + 1;i++)

{

S[i][0] = 1;

S[i][i] = 1;

}

for(int i = 2;i < m + 1;i++)

{

for(int j = 1;j < i;j++)

{

S[i][j] = S[i - 1][j - 1] + S[i - 1][j];

}

}

return S[m][n];

}

}

程序测试截图:

技术分享

(3)使用递归的方法用组合数递推公式计算

程序设计思想:

定义n,k求组合数函数C(n,k)。当k = 0或n = k时,返回值为1。否则,根据递推公式,C(n,k) = C(n - 1,k - 1) + C(n - 1,k),

最后输出结果。

程序流程图:

技术分享

程序源代码:

import java.util.Scanner;

public class zuuuheshu {

public static void main(String[] args) {

System.out.print("请输入组合数中的底数m:");

Scanner sc = new Scanner(System.in);

int sc_m = sc.nextInt();

System.out.print("请输入组合数中的阶数n:");

int sc_n = sc.nextInt();

System.out.print("该组合数的结果为:"+jisuan(sc_m,sc_n));

}

public static long jisuan(int m,int n)

{

if(m == n || n == 0)

return 1;else

return jisuan(m - 1,n - 1)+jisuan(m - 1,n);

}

}

程序测试截图:

技术分享

二:递归编程解决汉诺塔问题

程序设计思想:

当盘子的个数n=1时,直接从A移动到C;n>1时,可将其分为三个步骤:1)将上面n-1个盘子从A座移到B座上。2)将剩下的一个盘子从A座移到C座上。

(3)将B座上的n-1个盘子从B座移动到C座上。设置变量n为盘子数,根据n的不同输出结果。

程序流程图:

技术分享

程序源代码:

import java.util.Scanner;
public class Hanoi {
public static void main(String args[]){
System.out.println("请输入要移动的块数:");
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
move(n,‘a‘,‘b‘,‘c‘);
}
public static void move(int n,char a,char b,char c){
if(n==1){
System.out.println(a+"-->"+c);
}
else{
move(n-1,a,c,b);
System.out.println(a+"-->"+c);
move(n-1,b,a,c);
}
}
}

程序测试截图:

技术分享

三:使用递归判断方式判断某个字符串是否为回文

程序设计思想:

首先判断字符串如果小于等于1,则返回为true。若果字符串第一个与最后一个不相等,则输出为false,然后递归调用subString函数每次去掉头和尾,进行

判断。

程序流程图:

技术分享

程序源代码:

import java.util.Scanner;
public class Huiwenshu {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("请输入字符串:");
String skt = sc.nextLine();
System.out.println("Is it a Palindrome?"+isPalindrome(skt));
}

public static boolean isPalindrome(String s){
if(s.length()<=1){
return true;
}else if(s.charAt(0) != s.charAt(s.length()-1)){
return false;
}
return isPalindrome(s.substring(1,s.length()-1));
}
}

程序测试截图:

技术分享

 

02方法-作业01-递归练习

标签:==   作业   分享   substring   三角形   代码   设计思想   .com   练习   

原文地址:http://www.cnblogs.com/lwq666/p/7663653.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!