1

我想编写字符串反向函数而不使用附加或反向函数。

我写的代码如下:

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

此代码的输出如下:

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

但我想要(cba)形式的输出。我正在使用 DrScheme

4

3 回答 3

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)
于 2012-10-12T22:58:52.997 回答
1

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

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

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

于 2012-10-13T17:19:00.647 回答
-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();

    }
于 2015-11-24T11:13:54.997 回答