【发布时间】:2014-01-26 09:13:37
【问题描述】:
我正在尝试通过在 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 的行时,它会进入递归,然后从下层内部更新上层的变量。
如果我在 toPush 分配之后抛出一个 console.log(sections) ,则说明这一点很清楚。如果变量只限于递归函数的一个“级别”,则第一个部分日志将为空,因为该级别中没有任何内容填充它,但实际上是“[one]”。
无论如何问题是如何在使用 Javascript 的递归编程中处理这个问题。我可以指定一个变量不应该是全局的或可用于其中的递归吗?或者,如果不是,那么处理此类事情的 Javascript-y 方式是什么?
这是一个非常奇怪/意外的错误(我是 JS 新手,没有看到这个范围界定问题),如果有人有任何建议,我将不胜感激。
【问题讨论】:
标签: javascript recursion