Day20--递归

Day20--递归

A 方法调用 B 方法容易理解,

递归就是 A 方法调用 A 方法,即自己调用自己。

利用递归可以用简单程序解决复杂问题,通常把大型复杂问题层层转化为与原问题相似的规模较小问题求解,递归策略用少量程序描述解题过程所需多次重复计算,大大减少程序代码量。递归的能力在于用有限语句定义对象的无限集合。

递归结构包括两个部分:

  • 递归头,即什么时候不调用自身方法,没有头会陷入死循环;
  • 递归体,即什么时候需要调用自身方法。

没有递归头的示例;

package com.liu.www.method;

public class Demo05 {
    public static void main(String[] args) {
        Demo05 demo05 = new Demo05();
        demo05.test();

    }
    public void test(){
        test();      //没有递归头,会陷入死循环!!!!!
    }
}

递归图标:(左边的)

image-20241020150641924

例子1:创建能够计算阶乘的方法

package com.liu.www.method;
//计算阶乘
//1!=1
//5!=5*4*3*2*1
public class Demo06 {
    public static void main(String[] args) {
        System.out.println(f(5));
    }
    public static int f(int i){
        if(i==1){
            return 1;           //递归头f(1),程序进行到f(1)就不再进行
        }else{
            return i*f(i-1);
        }
    }
    
    
    
    /*
    f方法解释:
    当i=5时,
    f(5)=5*f(4)
            f(4)=4*f(3)
                    f(3)=3*f(2)
                            f(2)=2*f(1)
                                     f(1)=1
     */
}

由例子可知,计算f(5),就要计算f(4)、f(3)、f(2)、f(1)。计算的流程为:

f(5)--->f(4)--->f(3)--->f(2)--->f(1)--->f(2)--->f(3)--->f(4)--->f(5)

image-20241020153305443

奇怪的现象:

上面的f方法,当我输入i=100时,输出结果为0。这是咋回事?

原因:

计算 100 的阶乘结果为 0 是因为整数类型的范围限制。

在 Java 中,int类型能表示的数据范围是有限的。当计算较大的阶乘时,结果很容易超出int类型的取值范围,导致数据溢出,最终结果变为 0。

递归只对基数小的例子有用

posted @ 2024-10-20 15:42  1hahahahahahahaha  阅读(5)  评论(0编辑  收藏  举报