当前位置:   article > 正文

方法递归调用(非常非常重要,比较难)

递归调用


前言

今天,我们来学习一下方法的递归,希望我的讲解可以让您对方法的递归调用有更深的了解。

一、方法的递归调用是什么?

递归调用就是在当前的函数中调用当前的函数并传给相应的参数,这是一个动作,这一动作是层层进行的,直到满足一般情况的的时候,才停止递归调用,开始从最后一个递归调用返回。简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂问题,同时可以让代码变 得简洁。

二、递归能解决什么问题呢?

1、各种数学问题如:八皇后问题,汉诺塔,阶乘问题,迷宫问题,球和篮子的问题等等。

2、各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等。

3、将用栈解决的问题,代码实现变得更加简洁。

三、递归举例

举两个小案例来帮助大家理解递归调用机制。

1、打印问题

(1)代码如下

  1. package Test01;
  2. public class Test {
  3. public static void main(String[] args) {
  4. T t = new T();
  5. t.test(4);//输出什么?
  6. }
  7. }
  8. class T{
  9. public void test(int n){
  10. if(n>2){
  11. test(n-1);
  12. }
  13. System.out.println("n="+n);
  14. }
  15. }

(2)运行结果=================================================

(3) 内存分析法

 2、阶乘问题

(1)代码如下

  1. public class Test {
  2. public static void main(String[] args) {
  3. T t = new T();
  4. t.test(4);//输出什么?
  5. int res = t.factorial(5);
  6. System.out.println("5的阶乘res="+res);
  7. }
  8. }
  9. class T{
  10. public void test(int n){
  11. if(n>2){
  12. test(n-1);
  13. }
  14. System.out.println("n="+n);
  15. }
  16. public int factorial(int n){
  17. if (n == 1) {
  18. return 1;
  19. }else {
  20. return factorial(n-1)*n;
  21. }
  22. }
  23. }

(2)运行结果

 (3)内存分析

 三、递归的重要规则

四、递归调用应用实例

  1. public class MiGong {
  2. public static void main (String args[]){
  3. //创建一个迷宫 int map[][] = new int [8][]
  4. int map [][] = new int [8][7];
  5. //定义一个规则,1为不能过,0为能过
  6. //第一行和最后一行为1
  7. for(int i = 0;i<map.length;i++){
  8. for(int j = 0;j<map[i].length;j++){
  9. if(i == 0||i==7||j==0||j==6){
  10. map[i][j] = 1;
  11. }else {
  12. map[i][j] = 0;
  13. }
  14. }
  15. }
  16. map[3][1] = 1;
  17. map[3][2] = 1;
  18. //迷宫设置完成
  19. T aa = new T();
  20. aa.findWay(map,1,1);
  21. System.out.println("===================找路的情况");
  22. for(int i = 0;i<map.length;i++){
  23. for(int j = 0;j<map[i].length;j++){
  24. System.out.print(map[i][j]+" ");
  25. }
  26. System.out.println();
  27. }
  28. }
  29. }
  30. class T {
  31. public boolean findWay(int [][] map ,int i,int j){
  32. //0 能走 1不能走 2能走 3死路
  33. //初始位置在map [1][1]
  34. //如果在 map [6][5] 为2,表示已经找到
  35. if(map[6][5] == 2){
  36. return true;
  37. }else{
  38. if(map[i][j] ==0){
  39. map[i][j] = 2;
  40. //找路策略,下,右,上,左
  41. if(findWay(map , i+1 , j)){
  42. return true;
  43. } else if(findWay(map,i,j+1)){
  44. return true;
  45. } else if(findWay(map,i-1,j)){
  46. return true;
  47. } else if(findWay(map,i,j-1)){
  48. return true;
  49. } else {//上下左右 为 1 ,2,3
  50. map[i][j] = 3;
  51. return false;
  52. }
  53. }
  54. }
  55. System.out.println("n="+n);
  56. return false;
  57. }
  58. }

 今天的方法递归调用就暂时学到这里,往后我会继续更新。


总结

方法的递归调用主要就是明白是从哪里开始递,哪里开始归,注意方法递归中的细节(内存),栈与栈之间的关系,才是学习递归的重要方法。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/476496
推荐阅读
相关标签
  

闽ICP备14008679号