我想在不使用追加或反向函数的情况下编写字符串反转函数。
我编写的代码如下:
> (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
答案 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();
}