1

我有一个 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 传入的更新后的散列。

4

1 回答 1

4

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

于 2010-11-17T13:13:56.813 回答