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

これを行うための悪名高い方法が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 に答える