递归函数如何处理||运营商?

时间:2017-10-14 16:51:55

标签: javascript function recursion

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

  console.log(findSolution(13));

在它到达find之后工作期间(33,"(((1 + 5)+ 5)* 3)")为什么这会从之前删除+5而不是* 3它刚刚叫?

代码的工作:

find(1, "1")
 find(6, "(1 + 5)")
  find(11, "((1 + 5) + 5)")
    find(16, "(((1 + 5) + 5) + 5)")
      too big
    find(33, "(((1 + 5) + 5) * 3)") //why does this remove +5 from earlier and not *3 it just called
      too big 
  find(18, "((1 + 5) * 3)")
    too big
find(3, "(1 * 3)")
  find(8, "((1 * 3) + 5)")
    find(13, "(((1 * 3) + 5) + 5)")
      found!

1 个答案:

答案 0 :(得分:3)

每次find()次调用都会产生新的本地history。您的递归调用不会更改 history;他们创造新的字符串。

因此在

    return find(current + 5, "(" + history + " + 5)") ||
          find(current * 3, "(" + history + " * 3)");

首先使用+ 5表单调用该函数,如果返回null,则使用* 3表单调用该函数。所以+ 5永远不会被删除&#34 ;;该字符串被简单地丢弃。

此外,对于||,如果左侧表达式返回非null,则根本不评估右侧。