可视化递归的展开和收缩过程

问题描述 投票:0回答:1

我正在练习SICP的练习1.17

#+begin_src ipython :session alinbx :results output
def fast_mul(a, b):
    if b == 1: return a
    else:
        if even(b): return 2 * fast_mul(a, b//2)
        if odd(b):  return a  + 2 * fast_mul(a, b//2)
def even(n):
    return n % 2 == 0

def odd(n):
    return n % 2 == 1
print(fast_mul(3, 7))
#+end_src

#+RESULTS:
: 21

我如何通过将print添加为]来查看膨胀和收缩的过程>

fast_mul(3,7)
3 + 2 * fast_mul(3, 3)
3 + 2 * (3 + 2 * fast_mul(3, 1))
3 + 2 * (3 + 2 * 3)
21

我正在练习SICP#+ begin_src的练习1.17 ipython:session alinbx:结果输出def fast_mul(a,b):如果b == 1:返回else:if even(b):return 2 * fast_mul(a, b // 2)...

python-3.x sicp
1个回答
1
投票
def fast_mul(a, b, s, d):
    if b == 1:
        print(s,a,') '*d)
        return a
    else:
        if even(b):
            print(s+f'2 * fast_mul({a}, {b//2})',') '*d)
            return 2 * fast_mul(a, b//2, s+'2 * ( ',d+1)
        if odd(b):
            print(s+f'{a} + 2 * fast_mul({a}, {b//2})', ') '*d)
            return a  + 2 * fast_mul(a, b//2,s+f'{a} + 2 * ( ',d+1)
def even(n):
    return n % 2 == 0

def odd(n):
    return n % 2 == 1
print(fast_mul(3, 7,'',0))
© www.soinside.com 2019 - 2024. All rights reserved.