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

输出列表是通过将列表中的每个元素组合起来,然后在输入上推进递归,直到输入用尽(在您的情况下,当数字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

上面将返回一个列表,其中包含给定数字的Collat​​zn序列:

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

附带说明:程序even?odd?是 Scheme 中的标准,您不必重新定义它们。

于 2013-02-13T22:36:29.083 回答