1.递归求 N 的阶乘的和
思路
循环递归先从1到N相乘,求出每一项的阶乘,在定义变量将它们相加
代码实现
public static int rec(int N){
int i=1;
int sum=0;
int num=1;
for(i=1;i<=N;i++){
num*=i;
sum+=num;
}
return sum;
}
运行结果
2.递归求和
求1+2+...+10
思路
循环递归将每一项相加
代码实现
public static int jSum(int a){
int sum=0;
for(int i=1;i<=a;i++)
{
sum+=i;
}
return sum;
}
运行结果
3.递归返回数字之和
思路
n%10得到最后一位数字,n/10将最后一位省略,在定义变量sum将每次的最后一位数字相加,求和
代码实现
public static int num(int n){
int sum=0;
while(n!=0){
sum+=n%10;
n=n/10;
}
return sum;
}
运行结果
4.递归求斐波那契数列的第 N 项
思路
斐波那契数列指:1 1 2 3 5 8 ...前两项为1,从第三项开始值为前两项的和,输入所求的项数,输出第N项
代码实现
public static int Fib(int n){
if(n==1||n==2){
return 1;
}else{
return Fib(n-1)+Fib(n-2);
}
}
运行结果
5.递归求解汉诺塔问题
思路
汉诺塔问题指:1.有三根杆子A,B,C。A杆上有若干碟子
2.每次移动一块碟子,小的只能叠在大的上面.把所有碟子从A杆全部移到C杆上
需要通过一个第三个盘子作为中间过渡,将盘子由大致小最终排列好
代码实现
//5.递归求解汉诺塔问题
/**
* 传入n个盘子,编号从1..n,我就能按照汉诺塔的规则,从目标盘子A -> C ,B是辅助盘
* @param nDisks
* @param A 起始柱子
* @param B 辅助柱子
* @param C 目标柱子
*/
public static void hanoiTower(int nDisks,char A,char B,char C) {
// 边界
if (nDisks == 1) {
// 直接一步到位,用不到B,A上的这一个盘子从A -> C
move(nDisks,A,C);
return;
}
// n >= 2,核心步骤1,先把顶上的 n -1个小盘子从A -> B,C作为辅助
hanoiTower(nDisks - 1,A,C,B);
// 核心步骤2.此时A上就剩下第n个盘子,一步到位将最大的这个盘子一次移动到C
move(nDisks,A,C);
// 核心步骤3.此时再把B上的这n-1个盘子从B -> C,A作为辅助
hanoiTower(nDisks - 1,B,A,C);
}
/**
* 将编号为n的盘子从sourceTower移动到destTower
* @param nDisks
* @param sourceTower
* @param destTower
*/
public static void move(int nDisks, char sourceTower, char destTower) {
System.out.println("编号为"+nDisks+"的盘子正在从"+sourceTower+"->"+destTower);
}
运行结果
main函数调用
public static void main(String[] args) {
System.out.println("请你们输入求斐波那契数列第几项");
Scanner sc1=new Scanner(System.in);
int sum2= sc1.nextInt();
int num2=Fib(sum2);
System.out.println(num2);
int N;
System.out.println("请您输入一个数N");
Scanner sc=new Scanner(System.in);
N=sc.nextInt();
int sum=rec(N);
System.out.println(sum);
int a=10;
int b=jSum(a);
System.out.println(b);
System.out.println("请您输入一个数num");
int num1= sc.nextInt();
int sum1=num(num1);
System.out.println(sum1);
System.out.println("请您输入你想求解汉诺塔问题的层数");
int n=sc.nextInt();
hanoiTower(n,'A','B','C');
}
}
整体代码
import java.util.Scanner;
public class day_8 {
//1.递归求 N 的阶乘
public static int rec(int N){
int i=1;
int sum=0;
int num=1;
for(i=1;i<=N;i++){
num*=i;
sum+=num;
}
return sum;
}
//2.递归求和
public static int jSum(int a){
int sum=0;
for(int i=1;i<=a;i++)
{
sum+=i;
}
return sum;
}
//3.递归返回数字之和
public static int num(int n){
int sum=0;
while(n!=0){
sum+=n%10;
n=n/10;
}
return sum;
}
//4.递归求斐波那契数列的第 N 项
public static int Fib(int n){
if(n==1||n==2){
return 1;
}else{
return Fib(n-1)+Fib(n-2);
}
}
//5.递归求解汉诺塔问题
/**
* 传入n个盘子,编号从1..n,我就能按照汉诺塔的规则,从目标盘子A -> C ,B是辅助盘
* @param nDisks
* @param A 起始柱子
* @param B 辅助柱子
* @param C 目标柱子
*/
public static void hanoiTower(int nDisks,char A,char B,char C) {
// 边界
if (nDisks == 1) {
// 直接一步到位,用不到B,A上的这一个盘子从A -> C
move(nDisks,A,C);
return;
}
// n >= 2,核心步骤1,先把顶上的 n -1个小盘子从A -> B,C作为辅助
hanoiTower(nDisks - 1,A,C,B);
// 核心步骤2.此时A上就剩下第n个盘子,一步到位将最大的这个盘子一次移动到C
move(nDisks,A,C);
// 核心步骤3.此时再把B上的这n-1个盘子从B -> C,A作为辅助
hanoiTower(nDisks - 1,B,A,C);
}
/**
* 将编号为n的盘子从sourceTower移动到destTower
* @param nDisks
* @param sourceTower
* @param destTower
*/
public static void move(int nDisks, char sourceTower, char destTower) {
System.out.println("编号为"+nDisks+"的盘子正在从"+sourceTower+"->"+destTower);
}
public static void main(String[] args) {
System.out.println("请你们输入求斐波那契数列第几项");
Scanner sc1=new Scanner(System.in);
int sum2= sc1.nextInt();
int num2=Fib(sum2);
System.out.println(num2);
int N;
System.out.println("请您输入一个数N");
Scanner sc=new Scanner(System.in);
N=sc.nextInt();
int sum=rec(N);
System.out.println(sum);
int a=10;
int b=jSum(a);
System.out.println(b);
System.out.println("请您输入一个数num");
int num1= sc.nextInt();
int sum1=num(num1);
System.out.println(sum1);
System.out.println("请您输入你想求解汉诺塔问题的层数");
int n=sc.nextInt();
hanoiTower(n,'A','B','C');
}
}