last-non-zero接受一個數字串列并回傳最后一個為 0cdr的數字。car
所以,我可以使用延續來實作它,但是我如何使用自然遞回來實作它。
(define last-non-zero
(lambda (ls)
(let/cc return
(letrec
((lnz
(lambda (ls)
(cond
((null? ls) '())
((zero? (car ls)) ;; jump out when we get to last 0.
(return (lnz (cdr ls))))
(else
(cons (car ls) (lnz (cdr ls))))))))
(lnz ls)))))
uj5u.com熱心網友回復:
這是一個明顯的版本,它不是尾遞回的:
(define (last-non-zero l)
;; Return the last cdr of l which does not contain zero
;; or #f if there is none
(cond
((null? l)
#f)
((zero? (car l))
(let ((lnzc (last-non-zero (cdr l))))
;; This is (or lnzc (cdr l)) but that makes me feel bad
(if lnzc
lnzc
(cdr l))))
(else
(last-non-zero (cdr l)))))
這是那個版本變成了尾遞回等價物,零測驗也移動了一點。
(define (last-non-zero l)
(let lnzl ([lt l]
[r #f])
(if (null? lt)
r
(lnzl (cdr lt) (if (zero? (car lt)) (cdr lt) r)))))
在最后一個版本中更清楚的是,串列只遍歷了一次。
uj5u.com熱心網友回復:
請指出我是否正確理解了問題:
#lang scheme
; returns cdr after last zero in lst
(define (last-non-zero lst)
; a helper function with 'saved' holding progress
(define (lnz-iter lst saved)
(if (null? lst)
saved
(if (zero? (car lst))
(lnz-iter (cdr lst) (cdr lst))
(lnz-iter (cdr lst) saved))))
(lnz-iter lst '()))
(last-non-zero '(1 2 3 0 7 9)) ; result (7 9)
uj5u.com熱心網友回復:
球拍takef-right可以做到:
> (takef-right '(1 2 0 3 4 0 5 6 7) (lambda (n) (not (zero? n))))
'(5 6 7)
但是假設你有一個任務,你應該自己撰寫邏輯而不是僅僅使用內置函式,一個簡單但不是非常有效的方法是反轉串列,從第一個零之前的所有內容中構建一個新串列,然后回傳。就像是:
(define (last-non-zero ls)
(let loop ([res '()]
[ls (reverse ls)])
(if (or (null? ls) (zero? (car ls)))
res
(loop (cons (car ls) res) (cdr ls)))))
uj5u.com熱心網友回復:
使用在沒有零的情況下回傳引數的實作,您可以只使用一個變數來保持您認為沒有零值的值,直到您點擊它,然后更新兩者:
(define (last-non-zero lst)
(let loop ((lst lst) (result lst))
(cond ((null? lst) result)
((zero? (car lst)) (loop (cdr lst) (cdr lst)))
(else (loop (cdr lst) result)))))
(last-non-zero '()) ; ==> ()
(last-non-zero '(2 3)) ; ==> (2 3)
(last-non-zero '(2 3 0)) ; ==> ()
(last-non-zero '(2 3 0 1 2)) ; ==> (1 2)
uj5u.com熱心網友回復:
(define last-non-zero
(lambda (l)
((lambda (s) (s s l (lambda (x) x)))
(lambda (s l* ret)
(if (null? l*)
(ret '())
(let ((a (car l*))
(r (cdr l*)))
(if (zero? a)
(s s r (lambda (x) x))
(s s r
(lambda (r)
(ret (cons a r)))))))))))
uj5u.com熱心網友回復:
也可以使用foldr:
(define (last-non-zero l)
(reverse (foldl (lambda (e res) (if (zero? e) '() (cons e res))) 0 l)))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/515675.html
上一篇:列出所有中間重復結果
