Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 循环时的方案_Loops_Lisp_Scheme_Racket_Collatz - Fatal编程技术网

Loops 循环时的方案

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? (-

我对scheme语法有点陌生。。。我试着做一个简单的程序,输入一个整数,如果这个整数是偶数,做点什么,如果它是奇数,做点别的。 我能做到这一点。现在,我需要做一个循环,在这个循环中,我可以递减这个数,直到它等于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)

输出应该是一个数字序列。换句话说,它应该在一个列表中。

一个输出列表是通过考虑列表中的每个元素,然后在输入上推进递归,直到输入用尽为止(在您的例子中,当数字
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
的修改值都作为参数传递给下一个递归调用,这就是我们通常在模式中实现循环的方式。我明白了,我正在扩展这个项目,但我试图首先自己做,以了解,,我可能会再次在此发布。请检查此链接以了解项目的第二部分: