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'); } }