2012-10-12 86 views
1

我想寫字符串反向函數,而不使用追加或反向函數。字符串反向操作

我寫的代碼如下:

> (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

回答

2

您的解決方案是以錯誤的順序執行cons操作,這就是爲什麼結果是而不是的格式良好的列表。

正確的答案是簡單的用蓄電池儲存的答案 - 用很好的副作用,這是一個尾遞歸的解決方案:

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

前面的過程使用執行遞歸名爲讓利。或者,你可以使用一個內助的過程,這個版本是完全等價的:

(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) 
0

有一個臭名昭著的方式做到這一點,許多人發現意外:

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

如果是這樣的課程,然後,可能是不能接受的,但要了解它是有用的

+0

我用append操作完成了這項工作,但是我找到了一個方法,如果可以只使用cons,car和cdr – user1658435

+0

只用cons,car和cdr就可以實現append,所以答案是是。 – itsbruce

+0

那麼我在代碼中寫入的錯誤是什麼?我應該爲此做些什麼修改? – user1658435

-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(); 

    } 
+0

請解釋一下! –