首页 > 解决方案 > 可视化递归的扩展和收缩过程

问题描述

我正在练习 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

我怎么能通过添加看到膨胀和收缩的过程printas

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

标签: python-3.xsicp

解决方案


听起来您正在寻找trace,尽管默认值可能需要一些黑客攻击才能返回您正在寻找的特定详细信息,例如。

python -m trace -t fast_mul.py 

在 elisp 中,默认跟踪更接近您想要的输出,例如。

(defun fast-mul (a b)
  (if (eq 1 b) a
    (+ (if (evenp b) 0 a) (* 2 (fast-mul a (/ b 2))))))

(trace-function 'fast-mul)
(fast-mul 3 7)

;; 1 -> (fast-mul 3 7)
;; | 2 -> (fast-mul 3 3)
;; | | 3 -> (fast-mul 3 1)
;; | | 3 <- fast-mul: 3
;; | 2 <- fast-mul: 9
;; 1 <- fast-mul: 21

推荐阅读