递归<一> --- 求阶乘

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kyle0349/article/details/51836198

1、递归定义:百度百科
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

2、使用递归思想进行程序设计时要考虑的两个问题:
1. 子问题须与原始问题为同样的事,且更为简单;
递归的本质的通过有限次数(多次)调用自身,来将一个复杂的问题最终转化为一个简单的问题(得到已知条件),既然是调用自身,说明每次调用处理的问题应该是一致的。
2. 不能无限制地调用本身,须有个出口。
出口就是终止递归的条件, 我们必须要有这么一个条件来终止调用自身逐层返回一个已知的值来得到结果,否则不限递归下去,就如同死循环。

package cn.test;

import java.util.Scanner;

/**
 * 递归求阶乘
 */
public class Recursion1 {


    public static void main(String[] args) {

        System.out.println("输入一个大于0的数字,求该数字阶乘");
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        if(num > 0 ){
            System.out.println(recursive(num));
        }else{
            System.out.println("输入有误");
        }


    }

    private static int recursive(int num) {
        if(num == 1){ //出口
            return num;
        }else{
            return num * recursive(num-1);//调用自身
        }

    }
}

这里写图片描述

debug模式,可以清楚看到:
第17行开始调用方法recursive(num);
第25行方法被调用自身了4次后,第五次调用自身的时候,num的值为1(出口),将已知的值(return num;(num 就是1))逐层返回来完成之前调用第25行的方法。
这里写图片描述

递归的思想:
要完成本次方法的调用,就需要获取到本次方法内调用的方法的值,通过一层层调用,最终获取到一个已知的值,再一层层的返回来完成各层的方法,最后回到第一次调用的方法得到最终的值。
在本例中就是把5!的问题最终分解为1!的问题。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/kyle0349/article/details/51836198