3

私はスキーム構文がちょっと新しいです...整数が偶数の場合は何かを行い、奇数の場合は別のことを行う、整数を入力する単純なプログラムを作成しようとしています。この部分はできました。ここで、1 になるまで数値を減らすことができるループを作成する必要があります。これが私のコードです。

#lang racket

(define (even? n)
  (if (eqv? n 0) #t
         (odd? (- n 1))))
(define (odd? n)
  (if (eqv? n 0) #f
         (even? (- n 1))))

; this is the function that i wanted to be inside the loop
(define (sequence n)
(cond  
[(even? n) n( / n 2)]
[(odd? n) n(+(* n 3) 1) ] )

)
(sequence 5)

出力は一連の数字である必要があります。つまり、リスト内にある必要があります。

4

1 に答える 1

1

出力リストは、リストの一部である各要素をconsしてから、入力が使い果たされるまで(あなたの場合、数nが1の場合)、入力を介して再帰を進めることによって構築されます。リストの先頭にある要素を連続してconsし、再帰をnull値で終了することにより、新しい適切なリストが作成され、プロシージャの実行の最後に返されます。方法は次のとおりです。

(define (sequence n)
  (cond [(= n 1)                              ; if n=1, it's the  exit condition
         (list n)]                            ; return a list with last element
        [(even? n)                            ; if n is even
         (cons n (sequence (/ n 2)))]         ; cons n and advance the recursion
        [(odd? n)                             ; if n is odd
         (cons n (sequence (+ (* n 3) 1)))])) ; cons n and advance the recursion

上記は、指定された number のCollat​​zシーケンスを含むリストを返しnます。

(sequence 6)
=> '(6 3 10 5 16 8 4 2 1)

補足として、手続きeven?と手続きodd?はSchemeの標準であり、再定義する必要はありません。

于 2013-02-13T22:36:29.083 に答える