zoukankan      html  css  js  c++  java
  • 递归-阶乘&斐波拉契数列

    什么是递归函数/方法?


    任何一个方法既可以调用其他方法又可以调用自己,而当这个方法调用自己时,我们就叫它递归函数或者递归方法!

    通常递归有两个特点:    


    1.递归方法一直会调用自己直到某些条件满足,也就是说一定要有出口;

    2.递归方法会有一些参数,而它会把这些新的参数值传递给自己;(自己调自己);

    递归通常用于:  ①.阶乘  ②.斐波拉切数列;

    1.阶乘

    阶乘(!)是小于某个数的所有正整数的乘积;

    注意:0既不是正整数,又不是负整数;0是整数;

    0!=1

    1!=1

    2!=2*1!=2

    3!=3*2!=6

    4!=4*3!=24

    5!=5*4!=120

    ...

    n!=n*(n-1)!

    下面是计算阶乘的一种实现方法(没有使用递归):

    复制代码
     1 public long Factorial(int n){
     2 
     3 if(n==0)
     4 
     5 return 1;
     6 
     7 long value=1;
     8 
     9 for(int i=n;i>0;i--){
    10 
    11 value*=i;
    12 
    13   }
    14 
    15 return value;
    16 
    17 }
    复制代码

    // 递归方法:

    复制代码
     1 pubic long Factorial(int n){
     2 
     3 if(n==0){
     4 
     5 return 1;
     6 
     7 return n*Factorial(n-1);
     8 
     9   }
    10 
    11 }
    复制代码

    你知道的,n的阶乘实际上就是n-1的阶乘乘以n,且n>0;

    它可以表示成Factorial(n)=Factorial(n-1)*n;

    这是方法的返回值,但我们需要一个条件,也就是出口(注意:递归一定要有出口)

    如果n=0则返回1;

    现在这个程式的逻辑应该很清楚了,这样我们就能够轻易的理解了.

    2.(Fibonacci)斐波拉切数列:

    Fibonacci数列是按以下顺序排列的数字:

    1,1,2,3,5,8,13,21,34,55....

    我们不难发现数列的排列规律是:后一个数加上前一个数,以此类推;

    如果F0=0并且F1=1那么Fn=F(n-1)+F(n-2);

    下面是计算Fabonacci数列的一种实现方法(没有使用递归):

    复制代码
     1 public long Fibonacci(int n){
     2 
     3 int a=1;
     4 
     5 int b=1;
     6 
     7 int n;  //  声明一个变量用来定义数列的长度;
     8 
     9 for(int i=2;i<n;i++){
    10 
    11 b=a+b;    //  得到b的值;
    12 
    13 a=b-a;    //  得到上一次a的值;
    14 
    15   }
    16 
    17 }
    复制代码

    //  递归方法:

    复制代码
     1 public long Fabinacci(int n){
     2 
     3 if(n==0||n==1){  //  满足条件
     4 
     5 return n;  
     6 
     7   }
     8 
     9 return Fabinacci(i-2)+Fabinacci(i-2);  //  返回值
    10 
    11 }
    复制代码

    我们通过排列发现,Fabonacci数列实际上就是后一个数加上前一个数的和

    Fabonacci(n)=Fabonacci(n-2)+Fabonacci(n-1);

    当数列元素从0开始排列时,满足判断条件得到返回值 n;

    然后跳出进行下面语句,一直循环到满足n的条件,跳出出口得到返回值Fabonacci(n);

    总结:方法实现体内再次调用方法本身的本质是多个方法的简写;

       它既可以调用其他方法,又可以调用自身.

       递归一定要有出口;

    例:  

     

    复制代码
     1  public void Func1(ref int num){
     2 
     3   if(num<3){
     4 
     5     num++;
     6 
     7     Func2(ref num);
     8 
     9    }
    10 
    11 }
    12 
    13  
    14 
    15 public void Func2(ref int num){
    16 
    17   if(num<3){
    18 
    19     num++;
    20 
    21     Func3(ref num);
    22 
    23    }
    24 
    25 }
    26 
    27  
    28 
    29 public void Func3(ref int num){
    30 
    31   if(num<3){
    32 
    33     num++;
    34 
    35     Func4(ref num);
    36 
    37    }
    38 
    39 }
    40 
    41  
    复制代码

    ......

    那么我们可以将上述方法直接简写:

    复制代码
     1 public void Func(ref int num){
     2 
     3 if(num<3){
     4 
     5   num++;
     6 
     7   Func(ref num);  
     8 
     9   }
    10 
    11 }
  • 相关阅读:
    day 66 crm(3) 自创组件stark界面展示数据
    day 65 crm(2) admin源码解析,以及简单的仿造admin组件
    用 Python+nginx+django 打造在线家庭影院
    django -admin 源码解析
    day 64 crm项目(1) admin组件的初识别以及应用
    云链接 接口不允许 情况 解决方法 mysql Host is not allowed to connect to this MySQL server解决方法
    day 56 linux的安装python3 ,虚拟环境,mysql ,redis
    day55 linux 基础以及系统优化
    Codeforces 989 P循环节01构造 ABCD连通块构造 思维对云遮月参考系坐标轴转换
    Codeforces 990 调和级数路灯贪心暴力 DFS生成树两子树差调水 GCD树连通块暴力
  • 原文地址:https://www.cnblogs.com/LiTZen/p/12400901.html
Copyright © 2011-2022 走看看