3

私はスキームにまったく慣れていないので、(1 2 3 4) のようなリストを取り、(4 1 2 3) を返す関数に送信したいと考えています。2 回目の実行では (3 4 1 2) が返され、関数の呼び出しごとに右シフトされたリストが作成されます。

この問題を解決するために私が見つけた最初の方法は、リストの最初と最後の値を再帰的に交換することです。したがって、スキームでは、リストのcarにリストのcdrを追加し、最後のスワップが1つだけになるまで、リストのcdrを関数に再帰的に送り返します。

しかし、私は再帰関数を作成するのが苦手で、スキームなどの新しい言語でそれを行うのに苦労しています。これは、私がどこに向かいたいかのアイデアを与えるためにこれまで試みてきたことです。

(define (rShift lst)
  (if (null? lst)
      '()
      (append (cdr lst (car lst))(rShift (cdr lst)))))
4

2 に答える 2

0

あなたができる最善の方法は、インタープリターのドキュメントを見て、利用可能なリスト関数を確認し、それらを使用してソリューションを構築することです。たとえば、リスト プロシージャを使用する Racket では、簡単なソリューションが実現します。

(define (rShift lst)
  (cons                             ; stick together the solution
   (last lst)                       ; pick the last item
   (take lst (sub1 (length lst))))) ; pick all items except the last one

やるだけやってみよう:

(rShift '(1 2 3 4))
=> '(4 1 2 3)

(rShift (rShift '(1 2 3 4)))
=> '(3 4 1 2)

この問題を解決するには数え切れないほどの方法があります。ニーズに最も適した方法を見つけるのはあなたに任せますが、覚えておいてください - 常に、既に自由に使えるビルディング ブロックの観点から問題を解決しようとし、そうしないでください。車輪の再発明。楽しみのために、次を使用して別の方法を示しreverseます。

(define (rShift lst)
  (let ((rev (reverse lst)))
    (cons (car rev)
          (reverse (cdr rev)))))
于 2013-06-22T22:49:04.487 に答える