如何判断我的尾递归Scheme函数是否正确优化

时间:2010-11-17 10:15:30

标签: scheme compiler-optimization tail-recursion

我有一个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传递。

1 个答案:

答案 0 :(得分:4)

这个函数确实是尾递归的,所以你在那里很好。但是,尾递归只意味着堆栈空间不会增长,而不是保证程序运行得很快。如果你想看看你的程序是否真正以递归方式运行,那么在观察Chicken所占用的总内存时运行它(并确保你没有在make-some-updated中分配内存,你可能会这样做)。如果内存增长,那么Chicken不会根据标准正确编译您的程序。