0

最近、私は再帰関数を学び、いくつかの演習を試みていますが、立ち往生しています。

質問は list-nth-item で、リスト (lst) と自然数 (n) を消費し、存在する場合は lst の n 番目の要素を生成し、存在しない場合、関数は false を生成します。(list-nth-item (list 1 2 3) 0)最初の項目はインデックス 0 にあることに注意してください。たとえば、次のようになります。1

これが私のコードです

     ;;list-nth-item consumes list and a natural number
     ;;and produces the n-th element in the list or false
     ;;list-nth-item: List Nat -> (Anyof Any false)
    (define (list-nth-item lst n)
          (cond
            [(empty? lst)false]
            [(= n 0)(first lst)]
            [else ????]))


         (list-nth-item (list 1 2 3)2)--> should produce 3

したがって、適切な再帰ではないことはわかっています。また、n = 0 の場合、リストの例の最初の番号を生成する(list-nth-item (list 1 2 3)0)必要があります1。再帰を形成する方法がわからないだけで、これは初めてです。

4

1 に答える 1

1

リストをベルトコンベアと考えてください: アイテムに到着したかどうかを確認し (最初の case を使用(= n 0))、そうでない場合 ( elsecase )、リストの末尾を取得して (cdr関数を使用) プロセスを繰り返してベルトをシフトします。

これは、次のように実行できます。

(define (list-nth-item lst n)
  (cond
    [(empty? lst) #f]
    [(zero? n) (car lst)]
    [else (list-nth-item     ; <-- repeats the process
           (cdr lst)         ; <-- shifts the "belt"
           (sub1 n))]))      ; <-- updates the number of steps to go

PS: これはlist-ref関数によって既に行われています。

于 2016-10-25T06:43:22.020 に答える