方案递归(十进制到八进制)

标签 scheme base-conversion

因此,我们类的任务是将十进制数转换为八进制表示形式。我设法修补它直到它起作用,但我在理解它为什么起作用时遇到了一些问题。 有没有可能以更简单的方式解释递归?谢谢。

(define octify
 (lambda (n)
  (cond
   ((zero? n) 0)
   ((zero? (quotient n 8)) n)
   (else  (+ (* 10 (octify (quotient n 8))) (remainder n 8))))))

最佳答案

首先,“数字”不是十进制或八进制。 “数字”是一个数学概念,它以某种格式和一堆位存储在计算机中。十进制和八进制是指数字的不同字符串表示形式。也就是说,“十进制”和“八进制”等仅在谈论字符串时才有意义,并且特定数字可以转换为十进制或八进制或其他形式的字符串。

生成整数的八进制(或其他基数)字符串表示形式是编程中的一项常见基本任务。您基本上已经弄清楚的算法:将数字除以基数的余数得到最后一位数字,然后递归计算数字除以基数的商以获得数字的其余部分(除了最后一位数字之外的所有数字)。

您正在做的事情的奇怪之处在于您没有生成字符串,就像人们通常为这项任务所做的那样。相反,您尝试将其打包回一个数字,从而使生成的数字的十进制表示形式看起来像原始数字的八进制表示形式。 (这恰好是可能的,因为任何八进制表示形式也是某个数字的有效十进制表示形式。例如,这对于十六进制是不可能的。)换句话说,您将数字转换为其八进制字符串表示形式,然后解析将该字符串转换为数字,就好像它是十进制表示形式一样。例如,以数字 42 为例,其十进制表示为字符串“42”,八进制表示为字符串“52”。您的程序返回数字 52(其八进制表示形式是字符串“64”)。

您可能会感到困惑,因为您正在将其输入到解释器中,并且当您计算或打印数字时,它会输出十进制表示形式。但重要的是要了解数字与字符串完全不同。 (如果你在解释器中计算了一个字符串,也许它会用引号或其他东西包围它。)如果你的程序输出八进制表示的字符串,而不是打印时看起来像它的数字,那将是最有意义的。

关于方案递归(十进制到八进制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9057638/

相关文章:

scheme - SICP 1.45 - 为什么这两个高阶函数不等价?

c++ - 十进制左移除法

ubuntu - 如何使用 shebang 表示法运行 guile Scheme 脚本?

scheme - 方案中的连续传递风格?

scheme - 连续传球风格中的 ANF 转换

c++ - 从任何基数到基数 10 c++ 的转换

binary - 将重复的二进制数转换为十进制(表示为系列?)

c# - 如何在 C# 中将数字输出为一串位?

algorithm - 将非十进制数转换为另一个非十进制数

scheme - Racket 中的要求/键入契约(Contract)失败