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)

  • 然后调用(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

  • 然后通过递归向上跟踪

    因此,在(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))))))