练习1.16:设计一个过程,该过程将演变出幂运算,该过程使用连续平方并使用对数步长,而快速表达式也是如此。 (提示:利用(b(^ n / 2))^ 2 =(b(^ 2))^ n / 2的观察结果,与指数n和基数b一起保留一个附加状态变量a和定义状态转换,使得状态之间的乘积ab ^ n不变,在过程开始时a被取为1,而答案在过程结束时由a的值给出通常,定义状态之间不变的不变量的技术是考虑迭代算法设计的一种有效方法。
所以我非常努力,提出了这个解决方案:
(define (exp b n) (exp-iter b n 1)) (define (square p) (* p p)) (define (even? k) (= (remainder k 2) 0)) (define (exp-iter b counter product) (define (smash counter) (if (even? counter) (square (exp-iter b (/ 2 counter) product)) (* b (exp-iter b (- counter 1) product)))) (if (= counter 0) product (smash counter))) (exp 4 3) ;test
这运行得很好,但是我不确定这是否是作者要我做的。这有什么问题吗?我的解决方案真的是迭代的吗?
练习1.16:设计一个过程,该过程将演变出幂运算,该过程使用连续平方并使用对数步长,而快速表达式也是如此。 (提示:使用观察...
您的解决方案不是迭代的。迭代过程是在递归调用之后不调用任何东西的过程,而在这两行中不是这样: