当我运行下面的递归函数时,它返回“ 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);
答案 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)
最终check
是false
,因此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));