SICP 1.16 题 题解

刚刚做出来 sicp 里的 1.16 题,深有感触。看了一下网上的题解 ,并没有题目的分析过 程,因此把我的分析过程在这里记录了一下。

题目描述

根据书中给出的关系 img ,并且使用一个不变量记录中间结果,写出对数步数内迭代计算幂的函数。

分析

题目中说到令 img ,而 a 的初始值为 1,在最后 a 为运算的 结果(b 的 n 次方)。可得公式:img 。因此推知迭代终点为 n = 0

令初始公式为 img

  • n = 0 时,迭代结束
  • 当 n 为偶数时,可得 img ,在结果中可以把 b2 看作新 的 b,把 n/2 看作新的 n,然后继续迭代
  • 当 n 为奇数时,n-1 为偶数或者 0,有 img ,可以把 a*b 看作新的 a,把 bn-1 看作新的 b。

由此,所有的情况已经分析完毕。

源代码

1
2
3
4
5
6
7
8
9
10
#lang racket
(define (expt-iter b n a)
[cond ([= n 0] a)
([even? n]
(expt-iter (* b b) (/ n 2) a))
(else
(expt-iter b (- n 1) (* a b)))])

(define (expt b n)
(expt-iter b n 1))

本作品采用 署名-相同方式共享 4.0 国际 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 “不科学的科学君” (Liu233w) 与博客链接: https://liu233w.github.io ,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

加载评论框需要翻墙