JS中令人沮丧的递归函数

时间:2018-02-08 13:45:31

标签: javascript function recursion

我一整天都在震撼着我的大脑,而我仍然无法得到它。有人可以向我解释一下,这个功能究竟是如何起作用的?!?!?!



function findSolution(target) {
  function find(current, history) {
    if (current == target) {
      return history;
    } else if (current > target) {
      return null;
    } else {
      return find(current + 5, `(${history} + 5)`) ||
        find(current * 3, `(${history} * 3)`);
    }
  }
  return find(1, "1");
}

console.log(findSolution(24));
// → (((1 * 3) + 5) * 3)




如何在无限循环中不停地来回调用?

2 个答案:

答案 0 :(得分:1)

您可以在递归函数的第一行添加console.log并观察正在发生的事情。

我将函数更改为没有else部分的版本,因为所有if语句都会返回。

功能保持不变。

在函数find中,有两个退出条件,一个隐藏:

  1. 检查目标值,(好吧,这很明显)

  2. 检查当前值是否大于目标值,然后以null或任何其他falsy值退出,因为返回值用于下一个隐藏检查。

  3. 选中logical OR ||,如果

    find(current + 5, `(${history} + 5)`)
    

    返回truthy值,如果不返回其他函数调用的结果

    find(current * 3, `(${history} * 3)`)
    

    带有truty或falsy值(不带支票)。

  4. 一起开始时需要一个,并尝试添加5或乘以3,直到达到所需的值。

    
    
    function findSolution(target) {
    
        function find(current, history) {
            console.log(current, history);
        
            if (current == target) {
                return history;
            }
            if (current > target) {
                return null;
            }
            return find(current + 5, `(${history} + 5)`) || find(current * 3, `(${history} * 3)`);
        }
    
        return find(1, "1");
    }
    
    console.log(findSolution(24)); //  (((1 * 3) + 5) * 3)
    
    .as-console-wrapper { max-height: 100% !important; top: 0; }
    
    
    

答案 1 :(得分:1)

基本上,那个测试:

if (current == target) {
    return history;
}

测试是否找到了解决方案,然后返回该解决方案

同时进行测试:

if (current > target) {
    return null;
}

发现 无法找到解决方案 ,然后返回null。

例如,如果您尝试findSolution(10),则会获得null。

否则,如果我们不处于其中一个递归结束条件,代码将继续搜索并构建解决方案字符串。

因此,此代码将尝试构建" + 5"的所有可能组合。和" * 3"直到它产生给定的数字,或者如果组合产生更大的数字,则为null。