Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 方案递归(十进制到八进制)_Scheme_Base Conversion - Fatal编程技术网

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

Scheme 方案递归(十进制到八进制),scheme,base-conversion,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)))))) 首先,“数字”不是十进制或八进制。“数字”

所以我们班被分配了一个任务,把十进制数转换成八进制数。我设法修补它直到它工作,但我在理解它为什么工作时遇到了一些问题。 有没有可能以更简单的方式解释递归?谢谢

(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”)

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

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

生成整数的八进制(或其他一些基)字符串表示是编程中常见的基本任务。您基本上已经了解的算法是:将数字的剩余部分按基数计算得到最后一个数字,然后根据数字的商按基数递归得到数字的剩余部分(除最后一个数字外)

奇怪的是,您所做的事情并没有像通常执行此任务时那样生成字符串。相反,您试图将其重新打包为一个数字,这样生成的数字的十进制表示形式将与原始数字的八进制表示形式类似。(这是可能的,因为任何八进制表示法也是某个数字的有效十进制表示法。例如,十六进制表示法就不可能做到。)换句话说,您将一个数字转换为其八进制字符串表示法,然后将该字符串解析为一个数字,就好像它是十进制表示法一样。例如,以数字42为例,其十进制表示为字符串“42”,八进制表示为字符串“52”。程序返回数字52(其八进制表示为字符串“64”)


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

数字的主流表示法,是一种风靡世界的表示法。这是一种与商和余数运算的概念密切相关的表示法,您可以从递归函数定义中看到这一点。为什么呢

让我们快速地把它放在一边:位置符号并不是唯一可行的数字表示法。经常出现的一种方法是清点方法,其中一个数字不是零就是比一个数字多一个。我们可以用棍子。因为我们讨论的是程序,所以让我们使用数据类型

Number :== Zero
         | Successor(n) where n is a number
将此理解为“一个数字要么是零,要么是另一个数字的后续数字”。或者,要将其编码到支持结构化表示(如Racket)的方案中,我们可以这样写:

(define-struct Zero ())
(define-struct Successor (n))
例如,用这个符号表示三个
(后继者(后继者(后继者(零)))(如果我没记错的话,这个表示法叫做Peano)

处理此类结构化数据类型的函数通常具有与数据类型本身相同的形状。也就是说,在Peano中用于表示的函数将如下所示:

 ;; a peano-eating-function-template: peano-number -> ???
(define (a-peano-eating-function-template a-num)
   (cond [(Zero? a-num)
          ...]
         [(Successor? a-num)
          ...
          (a-peano-eating-function-template (Successor-n a-num)) 
          ...] 
Base10 :== Zero
         | NonZero(q, r) where q is a Base10, and r is a digit.

Digit :== ZeroD | OneD | TwoD | ... | NineD
其中,
将是您试图解决的关于Peano数的特定问题的特定内容。这是一个函数遵循其所处理的数据结构的问题。作为
Base10 :== Zero
         | NonZero(q, r) where q is a Base10, and r is a digit.

Digit :== ZeroD | OneD | TwoD | ... | NineD
(define-struct Zero ())
(define-struct NonZero(q r))

(define-struct ZeroD ())
(define-struct OneD ())
(define-struct TwoD ())
(define-struct ThreeD ())
(define-struct FourD ())
;; ...
(NonZero (NonZero (Zero) (FourD)) (TwoD))
;; a-number-eating-function-template: Base10 -> ??? 
(define (a-number-eating-function-template a-num)
  (cond
    [(Zero? a-num)
     ...]
    [(NonZero? a-num)
     ... (a-number-eating-function-template (NonZero-q a-num))
     ... (NonZero-r a-num)]))
(NonZero (NonZero (Zero) (FourD)) (TwoD))
((0 * 10 + 4) * 10 + 2)
42
(= n 0)   ;; or (zero? n)
(> n 0)
(quotient n 10)
(remainder n 10)
(define (a-decimal-eating-function-template n)
  (cond [(= n 0)
         ...]
        [(> n 0)
         ... (a-decimal-eating-function-template (quotient n 10))
         ... (remainder n 10)]))