2016-09-29 2 views
0

я следующие функции на JSFiddle:Java-рекурсивная функция, возвращающая неопределенная вместо ожидаемого результата

function getRandomPointsInRange(range){ 

     var x1 = rand(1, 40), 
      y1 = rand(1, 40), 
      x2 = rand(1, 40), 
      y2 = rand(1, 40), 
      result; 

     if(getDistance(x1, y1, x2, y2) < range){ 
      console.log('test'); 
      getRandomPointsInRange(range); 
     }else{ 

      result = {x1: x1, y1: y1, x2: x2, y2: y2}; 
      console.log(result); 
      return result; 
     } 
    } 

Он генерирует две точки с расстоянием, равным или больше, чтобы определенное расстояние (20 в этом случае). Проблема в том, что иногда функция возвращает undefined вместо ожидаемого результата. Вы не можете видеть это в JS Fiddle, но консольный журнал показывает, что функция возвращает undefined только тогда, когда функция вызывает себя хотя бы один раз (когда запускается console.log('test'). Даже когда функция возвращает undefined, результат сам по себе определяется как объект (вторая консоль. журнал показывает соответствующий объект с координатами точек) Почему это происходит и как это можно исправить, так что соответствующий объект будет всегда возвращается

JS Fiddle ссылка:.?. https://jsfiddle.net/3naLztoa/2/

+0

Поиск ответов было так просто, как погуглить слова из Вашего названия: [site: stackoverflow.com возвращает рекурсивную функцию javascript undefined] (https://www.google.com/search?q=site%3Astackoverflow.com+javascript+recursive+function+returns+undefined) –

ответ

2

Прима Виста, вам нужен другой return

В основном рекурсивные функции требуют при любом выходе значения, если функция должна быть r это значение. Если вы не указали один, вы получите по дизайну, undefined.

Чтобы предотвратить это, вы должны вернуть значение другого вызова рекурсивной функции.

function getRandomPointsInRange(range) { 
    var x1 = rand(1, 40), 
     y1 = rand(1, 40), 
     x2 = rand(1, 40), 
     y2 = rand(1, 40), 
     result; 

    if (getDistance(x1, y1, x2, y2) < range) { 
     console.log('test'); 
     return getRandomPointsInRange(range); 
     // ^^^^ 
    } else { 
     result = {x1: x1, y1: y1, x2: x2, y2: y2}; 
     console.log(result); 
     return result; 
    } 
} 
0

@Nina говорит, вам нужен еще один return, и печатать JSON JSON.stringify показать результат:

function getDistance(x1, y1, x2, y2) { 
 

 
    var result = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); 
 
    return result; 
 
}; 
 

 
function rand(min, max) { 
 
    return Math.floor(Math.random() * (max - min + 1)) + min; 
 
}; 
 

 
function getRandomPointsInRange(range){ 
 
\t \t 
 
\t \t var x1 = rand(1, 40), 
 
\t \t \t y1 = rand(1, 40), 
 
\t \t \t x2 = rand(1, 40), 
 
\t \t \t y2 = rand(1, 40), 
 
\t \t \t result; 
 
\t \t \t 
 
\t \t if(getDistance(x1, y1, x2, y2) < range){ 
 
\t \t \t return getRandomPointsInRange(range); 
 
\t \t }else{ \t \t \t 
 
\t \t \t result = {x1: x1, y1: y1, x2: x2, y2: y2}; 
 
\t \t \t return result; 
 
\t \t } 
 
\t } 
 
    document.getElementById('result').innerHTML = JSON.stringify(getRandomPointsInRange(20));
<body> 
 
    <p id="result"> 
 

 
    </p> 
 
</body>