反向方案
Reverse in Scheme
我编写了以下代码来反转 Scheme 列表:
(define (my-reverse lst)
(if (null? lst)
'()
(append (my-reverse (cdr lst)) (list (car lst)))))
当我为列表 (list 1 2 3 4 5) 跟踪此函数时,Scheme 显示如下:
>(my-reverse (mcons 1 (mcons 2 (mcons 3 (mcons 4 (mcons 5 '()))))))
> (my-reverse (mcons 2 (mcons 3 (mcons 4 (mcons 5 '())))))
> >(my-reverse (mcons 3 (mcons 4 (mcons 5 '()))))
> > (my-reverse (mcons 4 (mcons 5 '())))
> > >(my-reverse (mcons 5 '()))
> > > (my-reverse '())
< < < '()
< < <(mcons 5 '())
< < (mcons 5 (mcons 4 '()))
< <(mcons 5 (mcons 4 (mcons 3 '())))
< (mcons 5 (mcons 4 (mcons 3 (mcons 2 '()))))
<(mcons 5 (mcons 4 (mcons 3 (mcons 2 (mcons 1 '())))))
我不明白的是,为什么最后 5 被“追加”到 '(),而不是 '() 被追加到 5?因为在代码中写了 (append (my-reverse (cdr lst)) (list (car lst))) 和 (my-reverse (cdr lst)) 最后,所以 (my-reverse (cdr (list 5))) 是 '()?代码说 (append '() (list 5)?
正如您在 (my-reverse (mcons 5 '()))
的正向方向看到的那样,它表示“一个元素等于 5 的列表”的方式是 (mcons 5 '())
。而当函数 returns 一个元素的列表时,它再次显示为 (mcons 5 '())
.
我编写了以下代码来反转 Scheme 列表:
(define (my-reverse lst)
(if (null? lst)
'()
(append (my-reverse (cdr lst)) (list (car lst)))))
当我为列表 (list 1 2 3 4 5) 跟踪此函数时,Scheme 显示如下:
>(my-reverse (mcons 1 (mcons 2 (mcons 3 (mcons 4 (mcons 5 '()))))))
> (my-reverse (mcons 2 (mcons 3 (mcons 4 (mcons 5 '())))))
> >(my-reverse (mcons 3 (mcons 4 (mcons 5 '()))))
> > (my-reverse (mcons 4 (mcons 5 '())))
> > >(my-reverse (mcons 5 '()))
> > > (my-reverse '())
< < < '()
< < <(mcons 5 '())
< < (mcons 5 (mcons 4 '()))
< <(mcons 5 (mcons 4 (mcons 3 '())))
< (mcons 5 (mcons 4 (mcons 3 (mcons 2 '()))))
<(mcons 5 (mcons 4 (mcons 3 (mcons 2 (mcons 1 '())))))
我不明白的是,为什么最后 5 被“追加”到 '(),而不是 '() 被追加到 5?因为在代码中写了 (append (my-reverse (cdr lst)) (list (car lst))) 和 (my-reverse (cdr lst)) 最后,所以 (my-reverse (cdr (list 5))) 是 '()?代码说 (append '() (list 5)?
正如您在 (my-reverse (mcons 5 '()))
的正向方向看到的那样,它表示“一个元素等于 5 的列表”的方式是 (mcons 5 '())
。而当函数 returns 一个元素的列表时,它再次显示为 (mcons 5 '())
.