如何创建尾递归反向列表程序?

时间:2016-07-03 09:13:12

标签: function recursion scheme reverse tail-recursion

这是与此How to Reverse a List?类似的问题,但是对于迭代(尾递归)函数。我该如何创建这样的功能?有可能吗?

2 个答案:

答案 0 :(得分:2)

是;实际上 public string getvalue() { HtmlWeb web = new HtmlWeb(); HtmlAgilityPack.HtmlDocument doc = web.Load("www.fuchsonline.com"); var link = doc.DocumentNode.SelectNodes("//div[@id='footertext']"); return link.ToString(); } 的标准实现完全是尾递归的。

reverse

不喜欢使用(define (reverse xs) (fold cons '() xs)) ?没问题:

fold

答案 1 :(得分:2)

甚至更明确:

    (define (reverse xs)
     (let loop ((pend xs)
                (res '()))
       (if (null? pend)
           res
           (loop (cdr pend) (cons (car pend) res)))))

Chris的 fold 答案更整洁,可以更好地表现(出于各种原因)。 至于问题的第二部分,它总是可能的,即每个函数都可以进行尾递归(例如,通过转换为cps,可以机械地完成)。