我正在尝试通过在javascript中创建数字到单词功能来改进我的JS。即,它需要1234并吐出“一千二百三十四”。来自Ruby背景并且想要写一些可以处理大量数字的递归,这就是我写的:
var smallNums = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'tweleve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'];
var suffixes = {"trillion": 1000000000000, "billion": 1000000000, "million": 1000000, "thousand": 1000, "hundred": 100};
var tens = {"ninety":90, "eighty":80, "seventy":70, "sixty":60, "fifty":50, "fourty":40, "thirty":30, "twenty":20}
function inWords (num) {
sections = [];
for (var word in suffixes) {
var suffix_val = suffixes[word];
if (num >= suffix_val) {
suffix_multiplier = Math.floor(num / suffix_val);
var toPush = inWords(suffix_multiplier) + " " + word;
sections.push(toPush);
num %= suffix_val;
}
}
for (var word in tens) {
var ten_val = tens[word];
if (num >= ten_val) {
sections.push(word);
num -= ten_val;
}
}
if (num > 0 || sections.length == 0) {
sections.push(smallNums[num]);
}
return sections.join(' ');
}
问题是,它不是输出“一千二百三十四”,而是输出,在这种情况下,是“两个二百三十四”。我已经对逻辑进行了三重检查,我认为这与变量范围问题有关。基本上,看起来所有变量(比如,sections
数组)在递归级别上都是相同的。
因此,当第一个循环使用toPush
命中行时,它会进入递归状态,然后从较低级别更新高级变量。
如果我在console.log(sections)
分配后抛出toPush
,那么清楚的是什么。如果变量只是作用于递归函数的一个“级别”,则部分的第一个日志将为空,导致该级别中的任何内容都没有填充任何内容,但事实上它是“[one]”。
无论如何问题是如何在使用Javascript的递归编程中处理这个问题。我可以指定变量不应该是全局的,也不能用于递归吗?或者,如果没有,Javascript-y处理这样的事情的方式是什么?
这是一个奇怪/意想不到的错误的地狱(我是JS的新手并没有看到这个范围问题),如果有人有任何建议,我会很感激。
答案 0 :(得分:5)
sections
是一个全局变量,这就是为什么它是相同的。在它前面写一个var
。