3

2つの数値を取り、最初の数値を開始番号、2番目の数値を終了値として、開始番号と終了番号の間の値を入力してリストを作成する関数を作成しようとしています。

例えば:

ユーザーは3と7を渡します:

出力は(3 4 5 6)である必要があります

私はこれを実行して再帰を使用しようとしていましたが、苦労しています:

 (define (createlist start end)
   (if(= start end)
      '())
   (cons start '())
    (createlist (+ 1 start) end))
4

2 に答える 2

4

この種の問題の解決策には、再帰を使用して途中でリストを作成する必要があるという繰り返しパターンがあります。一般的な手順を説明しましょう。空欄に記入してみましょう。

(define (createlist start end)
  (if (= <???> <???>) ; the problem is solved when start and end are the same
      '()             ; lists end in null
      (cons <???>  ; if we are not done yet, we `cons` the current value of start
            (createlist <???> end)))) ; with the result of calling the recursion
            ; notice that start is one step closer to the end, so we increment it

アルゴリズムの考え方は、各ステップで、でstart作成されているリストに現在の値を追加し、に達するまでcons増分し、この時点で再帰が終了することです。startend

TheLittleSchemerまたはHowtoDesign Programsのいずれかを参照する必要があります。どちらの本も、この種の再帰的な問題の解決策をリスト上で構成する方法を説明しています。

アップデート:

これまでに作成したコードを投稿したので、正しい答えをお見せします。括弧[部分ifの後に続く括弧else]と空白[if(は同じではありません]には十分注意してくださいif (。これらはSchemeでは非常に重要です。また、コードを正しくインデントすると、多くのバグを見つけるのに役立ちます。

(define (createlist start end)
  (if (= start end)
      '()
      (cons start
            (createlist (+ 1 start) end))))

<???>これで、 getがどのように正しく入力されるかを確認できます。

于 2012-10-04T03:30:11.717 に答える
1

ここにいくつかの提案があります(ソリューション全体を提供しようとはしません):

  • consの代わりに使用append

  • インデントを使用してプログラムの構造を表示します

  • theにifはelse値がありません-最後の行がそれであることが意図されていると思います-括弧を再配置する必要があります。また、一般的なスタイルは眉をひそめif(list(-代わりに使用if (list (ます(スペースに注意してください)。例:

    (define (my-function a b c)
      (if (= a 3)   ;; note the space between if and (
          b         ;; the 'then' line
          c))       ;; the 'else' line
    
  • createlist再発する場合は、その体内から呼び出す必要があります。list2番目はという意味createlistですか?2つのパラメータが必要であることを忘れないでください

  • 無限再帰が必要ない場合は、引数を変更して、終了に近づくようにしてください。startつまり、との同じ値で再帰したくないということですend。どちらをどのように変更する必要がありますか?

于 2012-10-04T03:19:33.327 に答える