gpt4 book ai didi

recursion - Racket :识别尾递归?

转载 作者:太空宇宙 更新时间:2023-11-03 18:37:32 25 4
gpt4 key购买 nike

我在 racket 中写了两个不同的函数来判断一个数字列表是否是升序的:

(define (ascending list)
(if (<= (length list) 1)
#t
(and (< (car list) (car (cdr list))) (ascending (cdr list)))))

(define (ascending-tail list)
(ascending-tail-helper #t list))

(define (ascending-tail-helper prevBool rest)
(if (<= (length rest) 1)
prevBool
(ascending-tail-helper (and prevBool (< (car rest) (car (cdr rest)))) (cdr rest))))

我很难确定第一个递增是否是尾递归,所以我用我认为是尾递归的东西重写了它。

我回想起来认为第一个不是尾递归的原因是我相信在每个递归级别,函数将等待“and”语句中的第二个参数返回,然后才能计算 bool 值表达。相反,对于 ascending-tail-helper,我可以在执行递归调用之前评估小于表达式。

这是正确的,还是我让自己比以前更困惑了?

最佳答案

DrRacket 可以帮助您确定调用是否处于尾部位置。单击“语法检查”按钮。然后将鼠标指针移至相关表达式的左括号。在你的例子中我得到这个:

enter image description here

紫色箭头表示表达式处于尾部位置。

来自手册:

Tail Calls: Any sub-expression that is (syntactically) in tail-position with respect to its enclosing context is annotated by drawing a light purple arrow from the tail expression to its surrounding expression.

关于recursion - Racket :识别尾递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12925369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com