如何解决使用递归函数将基数转换为字符串javascript
我正在尝试编写一个递归函数,它接受两个参数 - 一个整数输入 n 和一个整数基数 m - 并返回一个以 m 为基数的数字的字符串表示。我被困住了有人可以帮忙吗?
const toStr = (n,base) => {
//when no remainder return 1
if(n % base === 0) return 1;
if(n % base >= 1){
return toStr(Math.floor(n/base))+(n % base);
}
return " ";
}
toStr(199,10) //'199'
toStr(14,8)//'16'
toStr(30,2)//'11110'
解决方法
以下是一些一般性建议:- 在担心程序的实际代码之前,始终弄清楚问题/解决方案背后的逻辑。
现在更具体一点:- 当提醒为 0 时,您的第一行代码返回 1,这是为什么?当提醒为0时,表示被除数是除数的倍数。
这是(希望如此)一个易于理解的算法解释(您可以随时在线搜索完美的解释和最高效的解释):
- 从输入
n
的最右边数字开始,您在每一步的提醒(比如r
,我们很快就会谈到r
的表示)将是输出从右边开始。 - 获得当前数字后,从
r
中减去n
,然后将r
除以base
得到商(比如q
)。 - 对于从右边数起的下一个数字,这个商现在变成
n
。因此,回到第一步,将此q
视为n
以获取下一个数字,依此类推,直到q
base。 - 当
r
时0-9
的可接受字符串表示为0 <= r <= 9
,当a-z
时为10 <= r <= 35
。因此,这样的事情会起作用:r > 9 ? String.fromCharCode(87 + r) : String.fromCharCode(48 + r)
因为a
的 ascii 值是97
并且0
是48
。
这是一个应该可以工作的代码片段:
function toStr(n,base) {
if(n == 0) return "";
let r = n % base; // r is the reminder
return toStr((n - r) / base,base) // ((n - r) / base) is the quotient to consider as n for the rest of the conversion after extracting the right most digit
+ (r > 9 ? String.fromCharCode(87 + r) : String.fromCharCode(48 + r)); // concatenate the right most digit to the rest of the conversion
}
,
您忘记在递归调用中包含 base
为了降低复杂度,这个递归调用的基本情况是检查n是否为零,然后返回空字符串与上层堆栈调用返回的字符串进行连接
const toStr = (n,base) => {
//when no remainder return 1
if (!n) {
return "";
}
return toStr(Math.floor(n / base),base) + (n % base);
};
console.log(toStr(199,10)); //'199'
console.log(toStr(14,8)); //'16'
console.log(toStr(30,2)); //'11110'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。