zoukankan      html  css  js  c++  java
  • 数学没学好-(递归)

    递归其实和循环是非常像的,循环都可以改写成递归,递归未必能改写成循环,这是一个充分不必要的条件。那么,有了循环,为什么还要用递归呢??在某些情况下(费波纳切数列,汉诺塔),使用递归会比循环简单很多很多话说多了也无益,让我们来感受一下递归吧。我们初学编程的时候肯定会做过类似的练习:1+2+3+4+....+100(n)求和给出一个数组,求该数组内部的最大值我们要记住的是,想要用递归必须知道两个条件:递归出口(终止递归的条件)递归表达式(规律)技巧:在递归中常常是将问题切割成两个部分(1和整体的思想),这能够让我们快速找到递归表达式(规律)一、求和如果我们使用for循环来进行求和1+2+3+4+....+100,那是很简单的:

    
      int sum = 0;
        for (int i = 1; i <= 100; i++) {
    
            sum = sum + i;
    
        }
        System.out.println("公众号:Java3y:" + sum);
    
    

    前面我说了,for循环都可以使用递归来进行改写,而使用递归必须要知道两个条件:1、递归出口,2、递归表达式(规律)首先,我们来找出它的规律:1+2+3+...+n,这是一个求和的运算,那么我们可以假设X=1+2+3+...+n,可以将1+2+3+...+(n-1)看成是一个整体。而这个整体做的事又和我们的初始目的(求和)相同。以我们的高中数学知识我们又可以将上面的式子看成X=sum(n-1)+n好了,我们找到我们的递归表达式(规律),它就是sum(n-1)+n,那递归出口呢,这个题目的递归出口就有很多了,我列举一下:如果n=1时,那么就返回1如果n=2时,那么就返回3(1+2)如果n=3时,那么就返回6(1+2+3)当然了,我肯定是使用一个最简单的递归出口了:if(n=1) return 1递归表达式和递归出口我们都找到了,下面就代码演示:

    递归出口为1:

    public static void main(String[] args) {
            System.out.println(sum(100));
        }
    
      n 要加到的数字,比如题目的100
    
        public static int sum(int n) {
    
            if (n == 1) {
                return 1;
            } else {
                return sum(n - 1) + n;
            }
        }
    

    递归出口为4:

    public static void main(String[] args) {
            System.out.println(sum(100));
        }
    
      n 要加到的数字,比如题目的100
    
        public static int sum(int n) {
    
            //如果递归出口为4,(1+2+3+4)
            if (n == 4) {
                return 10;
            } else {
                return sum(n - 1) + n;
            }
        }
    
  • 相关阅读:
    pat甲级 1155 Heap Paths (30 分)
    pat甲级 1152 Google Recruitment (20 分)
    蓝桥杯 基础练习 特殊回文数
    蓝桥杯 基础练习 十进制转十六进制
    蓝桥杯 基础练习 十六进制转十进制
    蓝桥杯 基础练习 十六进制转八进制
    51nod 1347 旋转字符串
    蓝桥杯 入门训练 圆的面积
    蓝桥杯 入门训练 Fibonacci数列
    链表相关
  • 原文地址:https://www.cnblogs.com/huangxing123/p/15143275.html
Copyright © 2011-2022 走看看