我在方案中编写尾递归幂函数时遇到问题。我想使用辅助函数来编写该函数。我知道我需要一个参数来保存累计值,但在那之后我就陷入了困境。我的代码如下。
(define (pow-tr a b)
(define (pow-tr-h result)
(if (= b 0)
result
pow-tr a (- b 1))(* result a)) pow-tr-h 1)
我编辑了我的代码,现在它可以工作了。如下:
(define (pow-tr2 a b)
(define (pow-tr2-h a b result)
(if (= 0 b)
result
(pow-tr2-h a (- b 1) (* result a))))
(pow-tr2-h a b 1))
有人可以向我解释为什么辅助函数应该与主函数具有相同的参数吗?我很难思考为什么这是必要的。
“辅助函数应该与主函数具有相同的参数”的说法是不正确的。您只需要传递要传递的参数change在每次迭代中 - 在示例中,指数和累积结果。例如,无需将基数作为参数传递即可正常工作:
(define (pow-tr2 a b)
(define (pow-tr2-h b result)
(if (= b 0)
result
(pow-tr2-h (- b 1) (* result a))))
(pow-tr2-h b 1))
它之所以有效,是因为内部的辅助程序可以“看到”a
在外部主过程中定义的参数。因为基础永远不会改变,所以我们不必传递它。要了解更多相关内容,请查看精彩的文章中标题为“内部定义和块结构”的部分SICP http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-10.html#%_sec_1.1.8 book.
现在您正在使用帮助程序,最好开始使用named let http://docs.racket-lang.org/guide/let.html#%28part._.Named_let%29,一种非常方便的语法,用于编写帮助程序,而无需显式编码内部过程。上面的代码相当于:
(define (pow-tr2 a b)
(let pow-tr2-h [(b b) (result 1)]
(if (= b 0)
result
(pow-tr2-h (- b 1) (* result a)))))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)