Javascript |我创建的递归函数返回undefined以及正确的答案

时间:2018-11-03 02:53:44

标签: javascript

当我运行下面的递归函数时,它返回“ CLundefined”,这里“ CL”是正确的答案。据我所知,我已经定义了所有变量。有什么问题。

var roman = {
  M: 1000,
  CM: 900,
  D: 500,
  CD: 400,
  C: 100,
  XC: 90,
  L: 50,
  XL: 40,
  X: 10,
  IX: 9,
  V: 5,
  IV: 4,
  I: 1
};


function convertToRoman(num) {
  for (var key in roman) {
    var check = num >= roman[key];
    console.log(key);
    if (check) {
        return key + convertToRoman( num -= roman[key])
  }
}
}

convertToRoman(150);

3 个答案:

答案 0 :(得分:2)

您缺少recursion termination condition,在这种情况下为num === 0。这是为了停止递归循环。

var roman = {  M: 1000,  CM: 900,  D: 500,  CD: 400,  C: 100,  XC: 90,  L: 50,  XL: 40,  X: 10,  IX: 9,  V: 5,  IV: 4,  I: 1};
function convertToRoman(num) {
  if (num === 0) return "";
  
  for (var key in roman) {
    if (num >= roman[key]) return key + convertToRoman(num -= roman[key]);
  }
}

console.log(convertToRoman(150));

答案 1 :(得分:1)

最终checkfalse,因此if()块不运行。因此,提供了默认的返回作为函数的返回-您猜到它的默认值为undefined

最好在函数中使用局部变量(在for循环之外),然后返回该变量。

答案 2 :(得分:0)

只是为咯咯笑,但任何正在寻找迭代示例的人:

const ROMAN = {
    M: 1000,
    CM: 900,
    D:  500,
    CD: 400,
    C:  100,
    XC:  90,
    L:   50,
    XL:  40,
    X:   10,
    IX:   9,
    V:    5,
    IV:   4,
    I:    1
};

let x = Object.keys(ROMAN).reverse();
let y = Object.values(ROMAN).reverse();

function toRoman(n) {
    n = (n|=0) < 0 ? -n : n;
    if (n === 0) return null;
    
    let s = "";
    while (n !== 0) {
        let i = ((n >= y[y.length-1] && y.length) ||
                 y.findIndex(m => m>n)) - 1;
        
        s += x[i];
        n -= y[i];
    }
    return s;
}

console.log([
    0, -11, 100, 103, 234, 1928, 9832, 221, -23.3, 10.1, -0.3
].map(toRoman));