循环方案

时间:2013-02-13 22:24:34

标签: loops lisp scheme racket collatz

我在方案语法方面有点新...我正在尝试创建一个简单的程序,你输入一个整数,如果整数是甚至做某事,如果它是奇数做其他事情。 我能够做到这一点。现在,我需要创建一个循环,我可以减少数字,直到它等于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 个答案:

答案 0 :(得分:1)

输出列表是通过查询作为列表一部分的每个元素然后在输入上推进递归来构建的,直到输入用尽(在您的情况下,当数字n为1时) 。通过在列表的头部连续使用元素并以空值结束递归,创建新的正确列表并在过程执行结束时返回。方法如下:

(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

以上内容将返回一个列表,其中包含给定数字n的{​​{3}}序列:

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

作为旁注:程序even?odd?是Scheme中的标准,您无需重新定义它们。