数字的主流表示形式,是风暴带走世界的数字,是positional notation。它是一个与商和剩余操作概念密切相关的表示,你从递归函数定义中可以看到它。这是为什么?让我们快速放一边:位置表示法不是数字的唯一可行表示形式。经常出现的一种方法是统计方法,其中数字是零或比数字多一个。我们可以使用棍棒。由于我们正在讨论程序,我们使用数据类型。
Number :== Zero
| Successor(n) where n is a number
阅读此为“一个数字是零,或另一个数字的后继者”。或者,它在支持结构化的表述(如球拍)一个方案代码,我们可以这样写:
(define-struct Zero())
(define-struct Successor (n))
例如,代表这种表示是(Successor (Successor (Successor (Zero)))。 (如果我记得正确的话,这个表示法叫做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))
...]
其中...将具体到你正在试图解决的皮亚诺号特定问题的东西。这是关于他们正在处理的数据结构的功能问题。作为皮亚诺的饮食功能的一个具体的例子,这里有一个原来钢琴变成了一堆的明星:
;; peano->stars: peano-number -> string
;; Turn a peano in a string of stars. We are all made of stars.
(define (peano->stars a-num)
(cond [(Zero? a-num)
""]
[(Successor? a-num)
(string-append "*"
(peano->stars (Successor-n a-num)))]))
无论如何,所以数据类型自然会导致与特定形状的功能。这导致我们回到位置表示法。我们可以捕获位置表示法作为数据类型吗?
事实证明,我们可以!位置表示法(如十进制表示法)可以用类似于Peano编号描述的方式描述。让我们称这种表示Base10,它看起来是这样的:
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())
;; ...
例如,数可以Base10被表示为:
(NonZero (NonZero (Zero) (FourD)) (TwoD))
让人惊讶。这看起来有点疯狂。但让我们再多关注一下。和以前一样,与Base10处理功能,往往会产生符合Base10的结构形状:只是跟随
;; 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)]))
也就是说,我们可以得到在Base10工程相当多的免费递归函数的形状, Base10本身的结构。
...但这是一个处理数字的疯狂方式,对吧?嗯......记住,古怪表示为:
(NonZero (NonZero (Zero) (FourD)) (TwoD))
这里的另一种方式来表示相同的编号。
((0 * 10 + 4) * 10 + 2)
非常相同的想法。在这里,让我们摆脱几个括号。我们可以代表具有以下符号:
42
我们的编程语言是硬编码知道如何处理这个符号来表示数字。
什么是我们的等价物检查零?我们知道一个。
(= n 0) ;; or (zero? n)
什么是我们的等价物检查非零?简单!
(> n 0)
对于NonZero-q和NonZero-r,我们的等价物是什么?
(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)]))
看起来很熟悉吗? :)
2043

被折叠的 条评论
为什么被折叠?



