1

スキームで for ループを構築する方法がちょっと混乱しています。for ループはパート II で実装する必要があります。ここでは、数字のリストを取り、パート I のリスト内に各要素を挿入して長さを見つけます。私は最初の要素を取得するためにケーブルを使用しましたが、次のような出力を取得するには for ループまたは何かが必要です: '(7 10 5 16 106 37) ここに私のコードがあります:

#lang racket
; Part I
(define (sequence n)
(cond  [(= n 1)
      (list n)]
[(even? n)
( cons n(sequence( / n 2)))]
[(odd? n) 
( cons n(sequence (+(* n 3) 1))) ] ))

(sequence 3)

; Part II
(define (find-length items)
( cond [(null? items)
      (list items)]
  [find-length(length(sequence(car items))) ]   
  ))

  (find-length '(10 13 16 22 95 158))

出力は次のとおりです。

 '(3 10 5 16 8 4 2 1)
 7
4

2 に答える 2

4

これをまっすぐにしましょうitems。リスト内の各数値のコラッツシーケンスの長さが必要ですか?明らかにこれは宿題なので、今回は正直に答えることはできません。ソリューションの一般的な構造は次のとおりです。空欄に記入してください。

(define (find-length items)
  (if (null? items)           ; if the list is null
      <???>                   ; return the empty list
      (cons                   ; otherwise `cons` the
       (length <???>)         ; length of Collatz sequence of first element
       (find-length <???>)))) ; and recur over the rest of the list

手順をテストすると、結果は次のようになります。

(find-length '(10 13 16 22 95 158))
=> '(7 10 5 16 106 37)

あなたの答えはほぼ正しかったことに注意してください-この手順の基本ケースは単に空のリストであり、再帰を呼び出すのを忘れていました。スキームでは、少なくとも知っている限り、while、forループについては考えないようにしてください。再帰の観点から反復を実装します。これは慣用的な方法です。それをまっすぐにした後、Racketで利用可能な組み込みのループ構造の1つを使い始めることができます。

于 2013-02-14T20:28:04.633 に答える
0

正確な答えは出したくありませんが、リスト全体を反復して、この長さを次のように見つけることができます。

(define (length lst)
(if (null? items)
'()
(+ 1  (length(cdr lst)))))

このようにして、リストのすべての要素に再帰的にアクセスします。最初の要素が追加されていることがわかり、次に に等しいリスト+1の長さを見つけようとします。リストの最後に到達するまでこれを行います。cdrlength lst-1

于 2014-10-28T09:51:15.973 に答える