【发布时间】:2018-09-09 23:45:39
【问题描述】:
我创建了一个简单的函数,用于将数字转换为罗马数字。除了一件事,似乎一切都正常。
通过我的代码中的每次递归,保存罗马数字的字符串被重置为“”。
通过函数中的递归来维护此类变量的最佳做法是什么?
我尝试在全局范围内声明变量 romanStr = "",并删除程序中的条件声明,当然这奏效了。然而,我知道这是最糟糕的做法。
以数字1234为例,转换成罗马数字就是“MCCXXXIV”。我的程序只会返回最后一次递归的结果“IV”。
function convertToRoman(num) {
console.log(`START FUNCTION FROM THE BEGINNING`);
console.log(`current num: ${num}`);
if (typeof romanStr === "undefined") {
var romanStr = "";
}
const bNumbers = [1000, 500, 100, 50, 10, 5, 1];
const romanSymbols = {
0: ["M"],
2: ["C", "D", "M"],
4: ["X", "L", "C"],
6: ["I", "V", "X"]
};
const arraySelector = arrNum => num >= arrNum;
let symbolSetIndex = bNumbers.findIndex(arraySelector);
console.log(`symbolSetIndex: ${symbolSetIndex}`);
let symbolSet = romanSymbols[symbolSetIndex];
console.log(`symbolSet: [${symbolSet}]`);
let numString = num.toString();
let numeral = parseInt(numString[0]);
console.log(`numeral: ${numeral}`);
let nextNum = parseInt(numString.substr(1));
console.log(`nextNum: ${nextNum}`);
// CONDITIONAL STATEMENTS //
if (symbolSetIndex === 0) {
for (let i = 1; i <= numeral; i++) {
romanStr = `${romanStr}${symbolSet[0]}`;
}
return convertToRoman(nextNum);
}
if (numeral < 4) {
for (let i = 1; i <= numeral; i++) {
romanStr = `${romanStr}${symbolSet[0]}`;
}
}
if (numeral === 4) {
romanStr = `${romanStr}${symbolSet[0]}${symbolSet[1]}`;
}
if (numeral === 5) {
romanStr = `${romanStr}${symbolSet[1]}`;
}
if (numeral === 6) {
romanStr = `${romanStr}${symbolSet[1]}${symbolSet[0]}`;
}
if (numeral > 6) {
romanStr = `${romanStr}${symbolSet[1]}`; // requires the 5 numeral first
for (let i = 1; i <= numeral - 6; i++) {
romanStr = `${romanStr}${symbolSet[0]}`;
}
}
if (numeral === 9) {
romanStr = `${romanStr}${symbolSet[2]}${symbolSet[1]}`;
}
if (numString.length === 1) {
return romanStr;
}
return convertToRoman(nextNum);
}
console.log(convertToRoman(5214));
【问题讨论】:
-
为什么不将正在进行的值作为参数传递给下一次调用?
标签: javascript string variables recursion scope