我很难在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))
这是一个我难以掌握的概念性概念。
答案 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在递归调用中变小。
这种解释有意义吗?