Значительное разочарование от неопределенного типа возвращаемого значения функции - PullRequest
0 голосов
/ 03 января 2019

Мой опыт работы с рекурсивными вызовами не является глубоким или длинным, но я подумал, что эта проблема поможет получить хорошую оценку. Большая часть этого работает, но функция возвращает undefined:

const target = 1234; // count the number of digits

function numDigits(num, count=0){
     let div10 = count;
     div10 += 1;

     if(Math.floor(num / 10) < 1){
          console.log(`Entered the end and div10 is ${div10}`);
          return div10; // returning undefined
     }

     let curr = Math.floor(num / 10);
     console.log(`Bottom of call and dividing ${curr}`);

     numDigits(curr, div10);

}

numDigits(target);

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Рекурсия - это функциональное наследие, поэтому использование ее в функциональном стиле дает наилучшие результаты.Там нет "отсутствует return" ;в функциональном стиле return нет особой необходимости, так как это побочный эффект, он не создает значения, его нельзя вызывать как функцию и его нельзя комбинировать с другими выражениями.Другие императивные выражения стиля, такие как переназначение / мутация div10 += 1, также являются рецептом мигрени при рекурсивном использовании.

Ваша программа может быть значительно упрощена -

const numDigits = n =>
  n < 10
    ? 1
    : 1 + numDigits (Math .floor (n / 10))
        
console .log
  ( numDigits (1)         // 1
  , numDigits (22)        // 2
  , numDigits (333)       // 3
  , numDigits (999999999) // 9
  )

Переменная count все еще может использоваться, если вы предпочитаете.Это был бы практический шаг к обеспечению безопасности стека программы -

const numDigits = (n, count = 1) =>
  n < 10
    ? count
    : numDigits
        ( Math .floor (n / 10)
        , count + 1
        )
        
console .log
  ( numDigits (1)         // 1
  , numDigits (22)        // 2
  , numDigits (333)       // 3
  , numDigits (999999999) // 9
  )
0 голосов
/ 03 января 2019

Вы пропускаете return при рекурсивном вызове numDigits:

const target = 1234; // count the number of digits

function numDigits(num, count=0){
     let div10 = count;
     div10 += 1;

     if(Math.floor(num / 10) < 1){
          console.log(`Entered the end and div10 is ${div10}`);
          return div10; // returning undefined
     }

     let curr = Math.floor(num / 10);
     console.log(`Bottom of call and dividing ${curr}`);

     return numDigits(curr, div10); // HERE

}

console.log(numDigits(target));
...