【问题标题】:JavaScript recursive function using ternary operator使用三元运算符的 JavaScript 递归函数
【发布时间】:2020-08-02 14:21:03
【问题描述】:

为什么要在递归函数的三元运算符前加上return语句才能返回函数输出?

// This dose not work

    function rec(n) {
      n == 1 ? n : n + rec(n - 1);
    }

// This works as return statement is added before ternary operator
    function rec(n) {
      return n == 1 ? n : n + rec(n - 1);
    }

// This works
    function rec(n) {
      if (n == 1) return 1;
      return n + rec(n - 1);
    }

【问题讨论】:

  • 关于return,为什么您希望递归函数与非递归函数的工作方式任何不同?
  • 我的意思是当return是三元运算符的默认值时,为什么我必须额外添加它?

标签: javascript function recursion operator-keyword ternary


【解决方案1】:

// If you would like to do this in one line then correct solution would be:
    let rec = n => n == 1 ? n : n + rec(n - 1);
// Now you dont need to add the return keyword before

// This works as return statement is added before ternary operator
    function rec(n) {
      return n == 1 ? n : n + rec(n - 1);
    }

// This works
    function rec(n) {
      if (n == 1) return 1;
      return n + rec(n - 1);
    }

【讨论】:

    【解决方案2】:

    递归函数是在执行过程中调用自身的函数。三元运算符决定函数是否需要调用自身。所以return语句调用了相同的函数。

    在示例n == 1 ? n : n + rec(n - 1); 中,如果n=1 则该函数应返回n 的值,否则该函数将使用n-1 的新值调用自身。

    【讨论】:

      【解决方案3】:

      你需要退货是因为

      n + rec(n - 1);
      

      rec(n-1) 调用需要返回一个值才能计算 n + rec(n - 1),这适用于对 rec() 的每次调用,直到 n 在返回 1 时达到 1。

      【讨论】:

        【解决方案4】:

        return 在三元运算中绝不是默认值。 return 在箭头函数中是默认值,但在正常函数减速中不是默认值。 要从正常的函数执行返回输出,总是需要添加 return 语句,但在箭头函数的情况下它是可选的。

        function x() { 5;}
        console.log(x()); // Opuput: undefined
        
        let y = () => 5;
        console.log(y()); // Output: 5

        【讨论】:

          【解决方案5】:

          条件表达式(通常称为ternary)只是一个表达式。它产生一个值,但它不做任何事情。事实上,除非它有副作用,否则它完全没用,除非你:

          • 从函数中返回,
          • 将其结果分配给变量,或
          • 将其嵌套在另一个表达式中,您可以在其中执行其中一项操作

          您可能会对带有单个表达式主体的箭头函数返回该表达式的结果这一事实感到困惑。即使您没有明确使用return,该函数仍会返回它。并且由于这种简单性,条件表达式经常被用作箭头函数的主体。

          但是你必须在此处拥有return 并不比你必须拥有它更令人惊讶

          function add (x, y) {
            return x + y;
          }
          

          如果你在那里取出return,当函数被调用时,加法仍然会发生,但它不会产生任何值。你的原作也是这样。

          【讨论】:

            猜你喜欢
            • 2020-11-01
            • 1970-01-01
            • 2019-07-15
            • 2013-11-20
            • 2020-11-14
            • 1970-01-01
            • 1970-01-01
            • 2013-04-25
            相关资源
            最近更新 更多