使用递归函数将数字基数转换为字符串 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 值是 97048.

这是一个应该可以正常工作的代码片段:

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
}