我怎么能知道我的尾递归方案功能被正确

问题描述:

优化我有一个计划功能谁的基本形式是这样的我怎么能知道我的尾递归方案功能被正确

(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

它可能是你的代码的其他部分有一个隐藏的缓慢,但我也会尝试不同的Scheme实现:Gambit和Bigloo是值得尝试的两个编译器。 – erjiang 2010-11-18 03:33:51

+0

我可能会这样做,谢谢 – 2010-11-18 04:34:47

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

+3

另一件尝试的是DrRacket - 您可以输入代码并点击“校验语法”按钮 - 然后将鼠标悬停在表达式上将显示指示尾部位置的粉红色箭头。 – 2010-11-17 17:19:57

+0

啊。我认为除了节省堆栈空间之外,tail-call opts还提高了速度。感谢您的澄清。现在我只需要弄清楚我的速度在哪里呢? – 2010-11-17 19:18:24