递归的定义?何时使用递归?递归模型?递归执行过程?常见的递归思想的例题和实现?

我会带着你远行 2021-07-24 13:37 554阅读 0赞

递归

递归定义:
递归是指函数的定义中又调用函数自身的方法。

例题
求n(n为正整数)的阶乘

  1. int fun(int n){
  2. if(n==1) {
  3. return 0;
  4. }
  5. else {
  6. return (fun( n-1)*n);
  7. }
  8. }

这里需要注意的是递归问题的求解过程一般都需要返回值,在递归问题中没有返回值,会导致语法错误。

何时使用递归方法
1.定义是递归的,例如求阶乘和斐波那契数列
2.数据结构是递归的,如单链表
3.求解问题的方法是递归的,如梵塔问题

递归模型
递归模型分为递归体和递归终结条件,两者缺一不可。

  1. int fun(int n){
  2. if(n==1) {
  3. return 0;
  4. }
  5. else {
  6. return (fun( n-1)*n);
  7. }
  8. }

在这个简单的例子中,递归体就是 (fun(n-1)*n),终结条件是 if(n==1).

递归的执行过程


常见递归思想的例题
1.求n阶乘

  1. int fun(int n){
  2. if(n==1) {
  3. return 0;
  4. }
  5. else {
  6. return (fun( n-1)*n);
  7. }
  8. }
  1. 斐波那契数列

  1. int Fit(int n){
  2. if(n==1||n==2) {
  3. return 1;
  4. }else {
  5. return (Fit( n-1)*Fit(n-2));
  6. }
  7. }

3.n皇后问题
n皇后问题:将n个皇后摆放在N*N的棋盘中,互相不可攻击,有多少种摆放方式,每种摆放方式具体是怎样的?八皇后问题的核心思想就是放置之前检查行列四个斜方位即可。

  1. package NQueensDG;
  2. import java.util.Scanner;
  3. public class NQUEENSDIGUI {
  4. //下面是数据成员--------------------------------------------------
  5. static int n;//皇后个数
  6. static int []x;//当前解
  7. static long sum;
  8. //成员定义结束----------------------------------------------------
  9. NQUEENSDIGUI(int nn){
  10. n =nn;
  11. sum =0;
  12. x = new int [n+1];
  13. for(int i=0;i <= n ;i++)x[i]=0;//初始化都为0
  14. backtrack(1);
  15. }
  16. private void backtrack(int t) {
  17. // TODO 自动生成的方法存根
  18. if(t > n){
  19. sum++;
  20. print(x);
  21. }
  22. else
  23. for(int i=1;i<=n;i++){
  24. x[t]=i;
  25. if(place(t))backtrack(t+1);//递归调用,循环求解
  26. }
  27. }
  28. private void print(int[] x2) {
  29. System.out.println((x2.length-1)+"皇后的解为:");
  30. for(int i=1;i<=n;i++){
  31. System.out.print(" "+x2[i]);
  32. }
  33. System.out.println("");
  34. }
  35. private boolean place(int k) {
  36. for(int j=1;j < k;j++){
  37. if((Math.abs(k-j) == Math.abs(x[j]-x[k]))||(x[j] == x[k]))return false;
  38. }
  39. return true;
  40. }
  41. public static void main(String[] args) {
  42. int s;
  43. Scanner input = new Scanner(System.in);
  44. s = input.nextInt();
  45. NQUEENSDIGUI a = new NQUEENSDIGUI(s);
  46. System.out.println("---------------------------------");
  47. System.out.println("华丽的"+s+"皇后问题解");
  48. System.out.println(s+"皇后一共有:"+sum+"个解!");
  49. input.close();
  50. }
  51. }

4.Hanio问题

发表评论

表情:
评论列表 (有 0 条评论,554人围观)

还没有评论,来说两句吧...

相关阅读