我有一个Scheme函数,其基本形式如下所示
(define (foo param var)
(cond ((end-condition) (return-something))
((other-end-condit) (return-something-else))
(else
(let ((newvar (if some-condition
(make-some-updated var)
(destructive-update! var))))
(foo param newvar)))))
我觉得这很明显需要针对编译中的迭代进行优化,但是当我编译它(带有鸡)时,它的运行速度仍然非常慢。 (如果我理解R5RS规范:http://groups.csail.mit.edu/mac/ftpdir/scheme-reports/r5rs-html.old/r5rs_22.html,这看起来应该有效)
我在python中使用while循环编写了相同的精确算法,并且解释的程序在几秒钟内终止。我的编译方案大约需要15分钟,而且我很肯定算法是一样的。
我认为这是一个没有得到优化问题的尾递归,因为我无法想象它可能是什么,但我无法弄明白。有任何想法吗?值得一提的是,var是一个哈希值,破坏性更新只是添加一个元素,尽管它还返回更新的哈希值作为newvar传递。
答案 0 :(得分:4)
这个函数确实是尾递归的,所以你在那里很好。但是,尾递归只意味着堆栈空间不会增长,而不是保证程序运行得很快。如果你想看看你的程序是否真正以递归方式运行,那么在观察Chicken所占用的总内存时运行它(并确保你没有在make-some-updated
中分配内存,你可能会这样做)。如果内存增长,那么Chicken不会根据标准正确编译您的程序。