使用递归函数将数字基数转换为字符串 javascript
converting number bases to string using a recursive function javascript
我正在尝试编写一个递归函数,它采用两个参数 - 一个整数输入 n 和一个整数基数 m - returns 一个以 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'
您忘记在递归调用中包含 base
并且为了降低复杂性,此递归调用的基本情况是检查 n 是否为零,然后 return 空字符串与来自上层堆栈调用的 returned 连接
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'
这里有一些一般性建议:- 在担心程序的实际代码之前,请始终弄清楚 problem/solution 背后的逻辑。
现在更具体一点:-
你的第一行代码 returns 1 when reminder 是 0,这是为什么呢?当提示为0时,表示被除数是除数的倍数。
这里(希望)是一个可以理解的算法解释(你总是可以在线搜索完美的解释和最有效的解释):
- 从输入的最右边数字
n
开始,您的提醒(比如 r
,我们很快就会用到 r
的表示形式)在每一步都是当前的从右边开始输出的数字。
- 获得当前数字后,从
n
中减去 r
,然后将 r
除以 base
得到商(比如 q
).
- 这个商现在变成
n
从右数开始的下一个数字。因此回到第一步将此 q
视为 n
以获得下一个数字,依此类推直到 q
< base
.
-
r
在任何数字处接受的字符串表示形式在 0 <= r <= 9
时为 0-9
,在 10 <= r <= 35
时为 a-z
。因此,这样的事情会起作用: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
}
我正在尝试编写一个递归函数,它采用两个参数 - 一个整数输入 n 和一个整数基数 m - returns 一个以 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'
您忘记在递归调用中包含 base
并且为了降低复杂性,此递归调用的基本情况是检查 n 是否为零,然后 return 空字符串与来自上层堆栈调用的 returned 连接
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'
这里有一些一般性建议:- 在担心程序的实际代码之前,请始终弄清楚 problem/solution 背后的逻辑。
现在更具体一点:- 你的第一行代码 returns 1 when reminder 是 0,这是为什么呢?当提示为0时,表示被除数是除数的倍数。
这里(希望)是一个可以理解的算法解释(你总是可以在线搜索完美的解释和最有效的解释):
- 从输入的最右边数字
n
开始,您的提醒(比如r
,我们很快就会用到r
的表示形式)在每一步都是当前的从右边开始输出的数字。 - 获得当前数字后,从
n
中减去r
,然后将r
除以base
得到商(比如q
). - 这个商现在变成
n
从右数开始的下一个数字。因此回到第一步将此q
视为n
以获得下一个数字,依此类推直到q
<base
. -
r
在任何数字处接受的字符串表示形式在0 <= r <= 9
时为0-9
,在10 <= r <= 35
时为a-z
。因此,这样的事情会起作用: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
}