JavaScript рекурсивная функция с использованием троичного оператора - PullRequest
1 голос
/ 20 апреля 2020

почему необходимо добавить оператор возврата перед тернарным оператором в рекурсивной функции для возврата вывода функции?

// 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);
    }

Ответы [ 5 ]

1 голос
/ 20 апреля 2020

// 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);
    }
0 голосов
/ 20 апреля 2020

Условное выражение (часто называемое ternary) - это просто выражение. Он дает значение, но ничего с этим не делает. Фактически, если у него нет побочных эффектов, он абсолютно бесполезен, если вы либо:

  • не возвращаете его из функции,
  • присваиваете его результат переменной или
  • вложите его в другое выражение, в котором вы выполняете одно из следующих действий

Вы можете быть смущены тем фактом, что функции-стрелки с телами с одним выражением возвращают результат этого выражения. Он все еще возвращается функцией, даже если вы явно не используете return. И из-за этой простоты условные выражения часто используются в качестве тела функции стрелки.

Но не должно быть более удивительным, что вы должны иметь return здесь, чем то, что вы должны иметь его в

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

Если вы убрали return, добавление все равно произойдет при вызове функции, но не даст никакого значения. То же самое в вашем оригинале.

0 голосов
/ 20 апреля 2020

возврат никогда не используется по умолчанию в троичной операции. return по умолчанию в Arrow-функции, но не по умолчанию при нормальном замедлении функции. для возврата вывода из нормального выполнения функции всегда необходимо добавить оператор return, но это необязательно в случае Arrow-функции.

function x() { 5;}
console.log(x()); // Opuput: undefined

let y = () => 5;
console.log(y()); // Output: 5
0 голосов
/ 20 апреля 2020

Вам нужен возврат из-за

n + rec(n - 1);

, где вызов rec(n-1) должен возвращать значение, чтобы можно было вычислить n + rec(n - 1), и это происходит для каждого вызова rec() до n достигает 1, когда просто возвращает 1.

0 голосов
/ 20 апреля 2020

Рекурсивная функция - это функция, которая вызывает себя во время выполнения. Тернарный оператор решает, должна ли функция вызываться сама. Поэтому оператор return вызывает ту же функцию.

В примере n == 1 ? n : n + rec(n - 1);, если n=1, тогда функция должна вернуть значение n, если нет, то функция вызовет себя с новым значением, равным n-1.

...