字符串反向操作

时间:2012-10-12 22:03:44

标签: scheme

我想在不使用追加或反向函数的情况下编写字符串反转函数。

我编写的代码如下:

> (define rdc(lambda (ls)
                   (cond((null? ls) '())
                        (else (cons (rdc (cdr ls)) (car ls))))))

此代码的输出如下:

Input: > (rdc '(a b c))
Output: (((() . c) . b) . a)

但我希望以(c b a)的形式输出。我正在使用DrScheme

3 个答案:

答案 0 :(得分:3)

您的解决方案正在以错误的顺序执行cons操作,这就是为什么结果一个格式正确的列表。

正确的答案很简单,使用累加器存储答案 - 这是一个很好的副作用,这是一个尾递归解决方案:

(define (rdc lst)
  (let loop ((lst lst)
             (acc '()))
    (if (null? lst)
        acc
        (loop (cdr lst) (cons (car lst) acc)))))

前面的过程使用一个名为let来实现递归。或者,您可以使用内部帮助程序,此版本完全等效:

(define (rdc lst)
  (define (loop lst acc)
    (if (null? lst)
        acc
        (loop (cdr lst) (cons (car lst) acc))))
  (loop lst '()))

无论哪种方式,这都有效:

(rdc '(a b c))
> '(c b a)

答案 1 :(得分:1)

有一种臭名昭着的方式可以做到这一点,许多人偶然发现:

(fold cons '() '(a b c d))

如果这是课程作业,那么这可能是不可接受的,但理解它是有用的

答案 2 :(得分:-1)

    static void Main()
    {
        StringBuilder ob = new StringBuilder("welcome");// original string
        StringBuilder ot = new StringBuilder();
        for (int i = ob.Length - 1; i > -1;i-- )
        {
            ot.Append(ob[i]);//that object contain reverse string.
        }
        Console.WriteLine(ot);
        Console.ReadLine();

    }