2013-02-13 4 views
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) 

Выход должен быть последовательностью чисел. Другими словами, он должен быть внутри списка.

ответ

1

Список выходных данных строится путем принятия каждого из элементов, входящих в список, а затем продвижения рекурсии по входу до тех пор, пока вход не будет исчерпан (в вашем случае, когда число n равно единице). Последовательно ссылаясь на элементы во главе списка и заканчивая рекурсию нулевым значением, создается новый правильный список и возвращается в конце выполнения процедуры. Вот как:

(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 

выше будет возвращать список с Collatz последовательности для заданного числа n:

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

В качестве примечания: процедуры even? и odd? являются стандартными на схеме и вы не не нужно переопределять их.

+1

спасибо, что это прекрасно и быстро – Muhsag

+0

не могли бы вы объяснить, в какой части кода n декрементируется на 1, что, если у меня есть случай, который я хочу увеличить. Спасибо – Muhsag

+0

В последовательности Collatz число не уменьшено _ через one_. Если n четно, мы уменьшаем его, уменьшая его половину в этой части '(/ n 2)'. Если n нечетно, мы фактически увеличиваем его в этой части: '(+ (* n 3) 1)'. Обратите внимание, что в обоих случаях измененное значение 'n' передается как параметр для следующего рекурсивного вызова, и так мы обычно реализуем цикл в Scheme –

Смежные вопросы