在方案的输出中创建palindrom函数而不添加函数

时间:2018-12-24 13:39:18

标签: scheme racket

我正在尝试创建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)))))

感谢帮助。

1 个答案:

答案 0 :(得分:0)

就像Sylwester的评论一样,您可以制作自己的appendreverse版本。这是一个仅定义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 '() '()))