[Javascript] Intro to Recursion - Detecting an Infinite Loop

本文探讨了在使用递归函数时如何避免无限循环的问题,通过引入parents数组记录已访问的顶级命令,确保程序能够正确处理重复配置项,避免陷入无限循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

When using recursion, you must be mindful of the dreaded infinite loop. Using the recursive function that we’ve built up over the previous lessons, we look at how a simple duplicated configuration item could cause chaos for our program as it has no context of which items it has previously seen. We fix this problem by introducing a parents array, which can keep track of which top-level commands have already been accessed.

 

Previous:

let input, config;

input = ['dist'];

config = {
  "dist": ["build", "deploy"],
  "build": ['js', 'css', 'vender'],
  "js": ['babel', 'ng-Annotate', "uglify"],
  "css": ["sass", "css-min"]
};

var res = getTasks(config, input, []);

function getTasks(config, input, initial){
  
  return input.reduce((prev, next)=>{
    if(config[next]){
      return getTasks(config ,config[next], prev);
    }else{
      return prev.concat(next);
    }
  }, initial);
};

console.log(res);

 

----------

Code:

let input, config;

input = ['dist'];

config = {
  "dist": ["build", "deploy"],
  "build": ['js', 'css', 'vender', 'dist'],
  "js": ['babel', 'ng-Annotate', "uglify"],
  "css": ["sass", "css-min"]
};

var res = getTasks(config, input);

function getTasks(config, input, initial, parent){
  
  initial = initial || [];
  parent = parent || [];
  
  return input.reduce((prev, next)=>{
    
    if(parent.indexOf(next) > -1){
console.log('infinite loop detected!');
return prev; } if(config[next]){ return getTasks(config ,config[next], prev, parent.concat(next)); }else{ return prev.concat(next); } }, initial); }; console.log(res);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值