Maison > interface Web > js tutoriel > le corps du texte

Explication détaillée des fonctions récursives javascript (avec exemples)

不言
Libérer: 2018-10-23 15:59:59
avant
7123 Les gens l'ont consulté

Cet article vous apporte une explication détaillée des fonctions récursives JavaScript (avec des exemples). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

J'ai vu des fonctions récursives plusieurs fois, mais je n'ai jamais eu l'impression de les comprendre pleinement. Cette fois, j'ai eu le temps de lire la <>, et je me suis calmée pour la relire. . Récursion, j'ai l'impression de comprendre enfin un peu, résume ma façon stupide de résoudre ce genre de problème, haha

La fonction récursive c'est passer le nom d'une fonction Appelez votre propre fonction
C'est la définition dans le livre, mais c'est en fait la même. C'est tout aussi déroutant lorsque vous rencontrez des questions d'entretien similaires

Premièrement. regardez un cas dans le livre

function factorial(num){ 
    if (num <= 1){ 
         return 1; 
    } else { 
        return num * factorial(num-1); 
    } 
}
Copier après la connexion

Une récursion factorielle classique, il est facile de comprendre ce code, mais si on vous demande d'utiliser la récursivité pour écrire une factorielle, certaines personnes vont s'ennuyer.
Mon idée est

Étape 1 : Trouver le point de départ

    factorial(1) =  1  = 1   //要思考这个递归的起点在哪里,就像阶乘就是1  而累加的话就是0
    factorial(2) =  2 * 1  =2  //接着我们试着多写等式然后找出规律
    factorial(3) =  3 *  2  *  1 = 6
    factorial(4) =  4 *  3  *  2  * 1  = 24
Copier après la connexion

Étape 2 : Remplacer les nombres par des fonctions

    // 我们试着将等式右边的实际变量用左边的函数替换
    factorial(1) =  1  = 1
    factorial(2) =  2 * factorial(1) = 2    
    factorial(3) =  3 * factorial(2) = 6    
    factorial(4) =  4 * factorial(3) = 24
Copier après la connexion

Étape 3 : Trouver le modèle

    factorial(4) =  4 * factorial(3) = 24 
    //以的阶乘为例  4! =  4 *  3!(3的阶乘)
    //而3!其实就是这个函数本身,ta会继续调用递归函数直至调用到factorial(1)
    
    //把4替换成参数
    factorial(n) =  n * factorial(n - 1)
Copier après la connexion

Étape 4 : Convertir en fonction récursive

    再看下步骤2
        情况1:起点
        factorial(1) =  1  = 1
        情况2:费起点
        factorial(2) =  2 * factorial(1) = 2    
        factorial(3) =  3 * factorial(2) = 6    
        factorial(4) =  4 * factorial(3) = 24  
     
    所以方法内应该需要两种情况
        function  factorial(n){
            if(n>=1){
                 return  n *  factorial(n - 1)
            }else{
                return 1   //起点其实就是递归方法返回的起始值
            }
        }
Copier après la connexion

S'il n'y a toujours aucun moyen de comprendre cette fonction récursive, nous pouvons diviser toutes les récursions en fonctions anonymes

    //我们计算一个4阶乘
    fun(4){
        return  4 *  fun(3)
    }
    
    fun(3){
        return 3 *  fun(2)
    }

    fun(2){
        return  2 *  fun(1)
    }
    
    fun(1){
        return 1 
    }

   你运行fun(4)的时候,一层一层想内访问,访问到fun(1)时候,再讲所有的已知变量计算出结果
    fun(4)=>fun(3)=>fun(2)=>fun(1)=>fun(2)=>fun(3)=>fun(4)

    return  4 *  3 *  2 * 1
Copier après la connexion

Alors essayez d'autres exemples avec ma méthode stupide, haha, ça devrait être capable de gérer le gros problème Certaines des questions de l'entretien

Lizi 1 :

    //计算1-10之间的和

    //fun(0) = 0;            //0
    //fun(1) = 1;            //1
    //fun(2) = 2 +  fun(1)   //3
    //fun(3) = 3 +  fun(2)   //6
    //fun(4) = 4 +  fun(3)   //10

    
    function fun(num){
        if(num > 1){
            return num + fun(num-1)
        }else{
            return 1
        }
    
    }
    
    
    fun(10)   //55
Copier après la connexion

Lizi 2 :

    
    //一共有n格,每步可以走1格或者2格,问一共有多少走法。 
    // fn(1) =  1    //一个格子的时候只能走一步,所有只有一种走法
    // fn(2) =  2    //两个格子的时候,可以一次走1个两步,也可以走2个一步,所以是2种走法,后面就要拿个草稿纸算下了
    // fn(3) =  3    // fn(2) + fn(1)
    // fn(4) =  5    // fn(3) + fn(2)
    // fn(5) =  8    // fn(4) + fn(3)   //规律 :fn(n) =  fn(n-1) +  fn(n-2)  个人认为所有能做递归函数的,都是有规律可寻的.即便不是很理解其中的原理,但是通过代入数字,也是可以很快发现的这些相同之处,概括成函数的.
    
    function  fun(num){
        if(num == 1){
            return 1
        }else if(num == 2){
            return 2
        }else{
            return  fun(num-1) +  fun(num-2)
        }
    }
    
    fun(5)  // 8
Copier après la connexion

Je ne comprends probablement pas grand chose aux fonctions récursives. S'il y a une récursion. Pour les questions d'entretien, vous pouvez laisser un message pour en discuter ensemble, haha

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal