Loops 循环时的方案
我对scheme语法有点陌生。。。我试着做一个简单的程序,输入一个整数,如果这个整数是偶数,做点什么,如果它是奇数,做点别的。 我能做到这一点。现在,我需要做一个循环,在这个循环中,我可以递减这个数,直到它等于1。 这是我的密码:Loops 循环时的方案,loops,lisp,scheme,racket,collatz,Loops,Lisp,Scheme,Racket,Collatz,我对scheme语法有点陌生。。。我试着做一个简单的程序,输入一个整数,如果这个整数是偶数,做点什么,如果它是奇数,做点别的。 我能做到这一点。现在,我需要做一个循环,在这个循环中,我可以递减这个数,直到它等于1。 这是我的密码: #lang racket (define (even? n) (if (eqv? n 0) #t (odd? (- n 1)))) (define (odd? n) (if (eqv? n 0) #f (even? (-
#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)
输出应该是一个数字序列。换句话说,它应该在一个列表中。一个输出列表是通过考虑列表中的每个元素,然后在输入上推进递归,直到输入用尽为止(在您的例子中,当数字
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
上面将返回一个列表,其中包含给定编号的顺序n
:
(sequence 6)
=> '(6 3 10 5 16 8 4 2 1)
作为旁注:
偶数?
和奇数?
程序在Scheme中是标准的,您不必重新定义它们。请您解释一下代码中的哪个部分n递减1,如果我有一个案例,我想改为递增,该怎么办。感谢Collatz序列中的数字不会减少1。如果n是偶数,那么我们在这一部分中将它减半(/n2)。如果n是奇数,那么我们实际上在这一部分中增加它:(+(*n3)1)
。请注意,在这两种情况下,n
的修改值都作为参数传递给下一个递归调用,这就是我们通常在模式中实现循环的方式。我明白了,我正在扩展这个项目,但我试图首先自己做,以了解,,我可能会再次在此发布。请检查此链接以了解项目的第二部分: