我正在尝试创建palyndrom函数,该函数从输入字符串执行palyndrom。像这样的东西:(palindrome '(1 2 3 4)) ==> (1 2 3 4 3 2 1).
我已经在下面创建了此代码,但它返回了(palindrome '(1 2 3 4)) ==> (1 (2 (3 (4) 3) 2) 1)
我的代码如下。任务是不要使用追加或反向。
(define (palindrome l)
(cond
((null? (cdr l)) (list (car l)))
((list (car l) (palindrome (cdr l)) (car l)))))
感谢帮助。
答案 0 :(得分:0)
就像Sylwester的评论一样,您可以制作自己的append
或reverse
版本。这是一个仅定义append
函数(称为concatenate
)的示例。
(define (palindrome l)
(define (concatenate l1 l2)
(if (null? l1)
l2
(cons (car l1) (concatenate (cdr l1) l2))))
(define (p l)
(cond ((null? l) '())
((null? (cdr l)) l)
(else (cons (car l) (concatenate (p (cdr l)) (list (car l)))))))
(p l))
(palindrome '(1 2 3 4))
'(1 2 3 4 3 2 1)
这里是尾部递归版本:
(define (palindrome l)
(define (concatenate l1 l2)
(if (null? l1)
l2
(cons (car l1) (concatenate (cdr l1) l2))))
(define (p l prefix suffix)
(cond ((null? l) (concatenate prefix suffix))
((null? (cdr l)) (concatenate prefix (cons (car l) suffix)))
(else (p (cdr l) (concatenate prefix (list (car l))) (cons (car l) suffix)))))
(p l '() '()))