Не определено в конце цикла while - PullRequest
4 голосов
/ 14 июля 2020

Так что я впервые задаю вопрос о переполнении стека. Моя программа очень проста, и это просто практика, которую мой друг заставляет меня больше узнать о кодировании. Короче говоря, вот мой код:

let blocks = [
['H','L','S','J','U','B'],
['O','O','N','O','S','O'],
['M','V','O','Y','A','O'],
['E','E','W','' ,'' ,'' ]
];


let blocks_run = function(i,j) {
  while (i < blocks.length) {
    return blocks[i][j] + blocks_run(i+1,j)
  }
}

blocks_run(0,0);

по какой-то причине ответ всегда возвращает undefined в конце.

например,

HOMEundefined

Я просто хочу знаете, почему он добавляет undefined в конец.

Заранее спасибо!

Ответы [ 8 ]

1 голос
/ 14 июля 2020
let blocks_run = function(i,j) {
  while (i < blocks.length) {
    return blocks[i][j] + blocks_run(i+1,j)
  }
}

Эта функция использует while вместо if для выполнения оператора return, который рекурсивно вызывает функцию. Если условие не выполняется из-за того, что i находится за пределами границ, оно не возвращает ничего явно, что в JavaScript означает, что функция возвращает undefined.

В зависимости от того, что вы хотите, вы можете попробовать

let blocks_run = function(i,j) {
  if (i < blocks.length) {
    return blocks[i][j] + blocks_run(i+1,j)
  }
  return ""; // not undefined
}
1 голос
/ 14 июля 2020

В al oop нет необходимости, поскольку он никогда не будет запускать более одной итерации. Условный оператор позволит вам поместить все тело функции в одно выражение.

let blocks = [
['H','L','S','J','U','B'],
['O','O','N','O','S','O'],
['M','V','O','Y','A','O'],
['E','E','W','' ,'' ,'' ]
];


const blocks_run = (i, j) => 
  i < blocks.length ? blocks[i][j] + blocks_run(i+1,j) : '';

console.log(blocks_run(0,0));
1 голос
/ 14 июля 2020

let blocks = [
['H','L','S','J','U','B'],
['O','O','N','O','S','O'],
['M','V','O','Y','A','O'],
['E','E','W','' ,'' ,'' ]
];


let blocks_run = function(i,j) {
  while (i < blocks.length) {
    return blocks[i][j] + (blocks_run(i+1,j) ?? '');
  }
}

console.log(blocks_run(0,0));

Другое возможное решение.

0 голосов
/ 14 июля 2020

Для последней итерации, пока l oop внутри вашего метода не будет работать, так как i значение будет равно blocks.length. Поскольку ваш метод ничего не возвращает, когда условие становится ложным. Это означает, что по умолчанию возвращается undefined. Это то, что объединено в последнем. Поэтому верните пустую строку, чтобы решить эту проблему.

Решение:

let blocks = [
['H','L','S','J','U','B'],
['O','O','N','O','S','O'],
['M','V','O','Y','A','O'],
['E','E','W','' ,'' ,'' ]
];


let blocks_run = function(i,j) {
  while (i < blocks.length) {
    return blocks[i][j] + blocks_run(i+1,j)
  }
  return ''
}

blocks_run(0,0);
0 голосов
/ 14 июля 2020

Отредактировано для удобства чтения

let blocks_run = function(i,j) {
  /* base case */
  if (i == blocks.length) {
    return '';
  }

  return blocks[i][j] + blocks_run(i+1,j);
}

Видите ли, так работает рекурсия; blocks_run должен возвращать что-то , поэтому, когда рекурсия завершается и вы не указали базовый случай, вы получите возвращаемое значение undefined. Поскольку функция, которая вызвала blocks_run в последний раз, действительно была той же самой функцией, условие while завершилось, и вы получили + undefined.

0 голосов
/ 14 июля 2020

Вам нужно что-то вернуть в том случае, если i >= blocks.length, например:

  while (i < blocks.length) {
    return blocks[i][j] + blocks_run(i+1,j)
  }
  return '';
0 голосов
/ 14 июля 2020

В последней строке вы по-прежнему получаете следующую строку , которая не определена.

Рекурсивные функции должны иметь «базовый случай», который говорит им, чтобы они прекратили рекурсию.

let blocks = [
  ['H', 'L', 'S', 'J', 'U', 'B'],
  ['O', 'O', 'N', 'O', 'S', 'O'],
  ['M', 'V', 'O', 'Y', 'A', 'O'],
  ['E', 'E', 'W',  '',  '',  '']
];


let blocks_run = function(row, col) {
  while (row < blocks.length) {
    return row + 1 < blocks.length 
      ? blocks[row][col] + blocks_run(row + 1, col)
      : blocks[row][col];
  }
}
console.log(blocks_run(0, 0));
0 голосов
/ 14 июля 2020

let blocks = [
['H','L','S','J','U','B'],
['O','O','N','O','S','O'],
['M','V','O','Y','A','O'],
['E','E','W','' ,'' ,'' ]
];


let blocks_run = function(i,j) {
  while (i < blocks.length) {
    return blocks[i][j] + blocks_run(i+1,j)
  }
  return '';
}

console.log(blocks_run(0,0));

Ваша функция рекурсии по умолчанию возвращает undefined

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...