两个函数相互调用如何防止死循环

Antonia ·
更新时间:2024-09-20
· 697 次阅读

目录

两个函数相互调用防止死循环

js函数互相调用碰到的问题

项目场景

问题描述

原因分析

解决方案

总结

两个函数相互调用防止死循环

最近碰到了一个问题,就是两个函数相互调用遭遇死循环的问题,想了半天终于想出了一个算法破解,姑且叫它熵递减算法。

问题的抽象代码如下

/* *  methodA 和 methodB 循环调用,是死循环 * */ function methodA() {     console.log('A的事情');     methodB(); } function methodB() {     console.log('B的事情');     methodA(); }

不论调用哪个方法,都会产生死循环。

我想要的效果是:

如果触发A方法时,也执行一下B方法,到此为止不再循环下去,反之亦然。

因此,必须能判断方法是主动发起的,还是被动的。

抽象代码如下:

/* *  解决问题的关键在于,判断方法是主动发起的,还是被动的 * */ function methodA() {     console.log('A的事情');     if('A是主动的'){         methodB();     }else{         // 不再调用下去     } } function methodB() {     console.log('B的事情');     if('B是主动的'){         methodA();     }else{         // 不再调用下去     } }

解法,就是熵递减算法,如下

/* * 熵递减算法 * */ var pairMethodStep = 2; function methodA() {     pairMethodStep --;     console.log('A的事情');     if(pairMethodStep === 1){         methodB();     }else{         pairMethodStep = 2;     } } function methodB() {     pairMethodStep --;     console.log('B的事情');     if(pairMethodStep === 1){         methodA();     }else{         pairMethodStep = 2;     } }

熵递减算法的说明:

给一个全局变量,叫做总步数pairMethodStep ,初始值为2。任一个方法执行时,做完自己的事情后,把pairMethodStep减成1。然后,判断此时的pairMethodStep,如果是1, 就调用另一个方法;如果是0了,就不再继续调用了,而是把pairMethodStep恢复成2。

我们分析一下代码执行的过程。主动的方法执行前,pairMethodStep的值是2,它做完自己的事后,把pairMethodStep的值变成了1,紧跟着就会执行被动的方法;被动的方法执行前,pairMethodStep的值是1,被动的方法做完自己的事情后,把pairMethodStep的值减成了0,不会再调用另一个方法了(不会发生死循环了),而仅仅是把pairMethodStep还原成2。

目的达到。熵递减算法,能完美地解决两个函数相互调用的问题。

js函数互相调用碰到的问题 项目场景

两个函数互相调用时

(当一个系统比较大时,尤其是涉及到一些复杂的算法时,很有可能会碰到死循环的情况发生,造成系统的CPU飙升)

        function a1() {             console.log("a1");             b1();         }         function b1() {             console.log("b1");             a1();         } 问题描述

会进入死循环

原因分析

就类似for循环,或者递归函数如果没有退出条件就会一直执行

解决方案         let flagNum = 1;         function a1() {             flagNum--;             console.log("a1");             if (flagNum === 0) {                 b1();             } else {                 flagNum = 1;             }         }         function b1() {             flagNum--;             console.log("b1");             if (flagNum === 0) {                 a1();             } else {                 flagNum = 1;             }         } 总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持软件开发网。



调用 循环 函数

需要 登录 后方可回复, 如果你还没有账号请 注册新账号