我在球拍中编写了两个不同的函数来确定数字列表是否在升序:
(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”语句中的第二个参数返回,然后才能计算布尔表达式。相反,对于升尾助手,我可以在进行递归调用之前评估小于表达式。
这是正确的,还是我让自己比以前更加困惑?