Recursion 有人能解释一下这段代码所经历的递归吗?
我已经理解到调用Recursion 有人能解释一下这段代码所经历的递归吗?,recursion,scheme,racket,Recursion,Scheme,Racket,我已经理解到调用(rfmult 3 4),触发else语句,然后(-3 1)代替a,并将其切成两半,然后变成(rfmult 1 4)。在这一点上,我迷路了,因为如果它乘以2,它永远不会结束。我的脑子里似乎无法理解它。我想我已经明白了。。。。。。所以让我们打电话(rfmult 100 5) 然后调用(rfmult(100/25) (50/25)*2 ((25-1)/25)*2 (12/25)*2+b (6 5)*2 (3 5)*2 ((3-1)/25)*2 (15)*2+b 0 然后通过递归向上
(rfmult 3 4)
,触发else
语句,然后(-3 1)
代替a
,并将其切成两半,然后变成(rfmult 1 4)
。在这一点上,我迷路了,因为如果它乘以2,它永远不会结束。我的脑子里似乎无法理解它。我想我已经明白了。。。。。。所以让我们打电话(rfmult 100 5)
然后通过递归向上跟踪 因此,在(15)块中,b值变为15,因为5*2+5=15 然后,(3 15)块b变为15×2=30 然后,(6 30)b变成30*2=60 那么,(1260)60*2+5=125 (25)125*2=>250 这让我们回到(50250)的第一个调用,其中250*2=500,这是5*100的解
如果这是一个错误的思维过程,请纠正我!我已经在这个递归结构上坐了大约2个小时了,我很高兴看到它有点意义!递归在“基本情况”(没有递归调用)处结束。你的基本情况是
a
或b
是0
使用“跟踪定义”
(define (even x) (= (modulo x 2) 0))
(define (twice x) (* x 2))
(define (half x) (/ x 2))
(define (rfmult a b)
(cond ((= 0 a) 0)
((= 0 b) 0)
((even a) (twice (rfmult (half a) b)))
(else (+ b (twice (rfmult (half (- a 1)) b))))))
像这样:
|(rfmult 3 4)
| (rfmult 1 4)
| |(rfmult 0 4) ;; ends here
| |0
| 4
|12
(trace define(rfmult a b);这是一种基于乘法分布特性的算法。对于两个数字a和b,其中c为1/2A(2c=a),则ab等于2cb,但也等于2*(cb)。对于任何ab,其中d小于a(d=a-1),则ab=a+(d*b)。请注意,所编写的函数仅适用于整数。只需通过替换模型运行此函数。(rfmult 34)将(+4(两次(rfmult(一半(-3 1))4)简单地转换为(+4((rfmult 14)2)),然后(+4(*+4(rfmult(一半(-1)4))2)转换为(+4(*+4(rfmult 0)2))t0(+4(*4(*4)2))转换为(+8 4)转换为12)
(trace-define (rfmult a b) ; <= here
(cond ((= 0 a) 0)
((= 0 b) 0)
((even a) (twice (rfmult (half a) b)))
(else (+ b (twice (rfmult (half (- a 1))b))))))