您是否有信任/假设递归在Scheme中有效的提示?

时间:2011-10-23 18:45:43

标签: loops recursion scheme

我很难在PLT Scheme的递归中解决问题。

例如,如果你有这个代码(未完成),那么会输出一些“*”和b个“ - ”的代码:

(define (stars-and-stripes a b)
(local ((define repeat (lambda(w n) (cond [(= n 0) ""] [(> n 0) (string-append w (repeat w (− n 1)))]))))
(cond
[(= 0 a) (cons (repeat "-" b) empty)]
[(= 0 b) (cons (repeat "∗" a) empty)]
[ (and (> a 0) (> b 0)) ... (stars-and-stripes (− a 1) b) ... (stars-and-stripes a (− b 1))...])))

我如何相信这部分可以正常工作?

(stars-and-stripes (− a 1) b) ... (stars-and-stripes a (− b 1))

这是一个我难以掌握的概念性概念。

1 个答案:

答案 0 :(得分:2)

有趣的问题。答案归结为:

You can trust it due to the principle of induction for natural numbers.

该陈述值得详细阐述。让我们考虑一个更简单的递归函数:

(define (mult3 n)
  (cond
    [(= n 0) 0]
    [else    (+ 3 (mult3 (- n 1)))]))

我的主张是(mult3 n)计算所有自然数n的n次3。 如何证明以“for all n”结尾的陈述? 那么,必须使用归纳法。

基本情况是n = 0。 (mult3 0)返回什么?由于n = 0,使用第一个cond子句,结果为0.而且由于3 * 0 = 0,我们认为mult3在基本情况下工作。

对于归纳步​​骤,假设对于小于n的所有数字,该属性都为真,并且必须证明这意味着n的属性为真。 在这种情况下,我们必须假设我们可以假设(mult3 n-1)返回3 *(n-1)。

有了这个假设,我们必须考虑(mult3 n)返回的内容。 由于m不为零,因此使用第二个cond子句。返回的值 是(+ 3 (mult3 (- n 1)))我们有:

(mult3 n)  = (+ 3 (mult3 (- n 1))) 
           = (+ 3 3*(n-1))         ; by induction hypothesis
           = 3*n

对于此示例,您的问题是“我如何信任表达式(mult3 m-1) 工作正确吗?“。答案是,由于归纳原理,你可以相信它。简而言之:首先检查基本情况,然后在假设(mult3 m)适用于所有人的情况下检查(mult3 n) m小于n。

为了使用归纳原理,重要的是递归函数的参数要小一些。在mult3示例中,n变为n-1。 在星条和条纹示例中,a或b在递归调用中变小。

这种解释有意义吗?