你知道怎么写这个Scheme函数吗?

你知道怎么写这个Scheme函数吗?,scheme,collatz,Scheme,Collatz,你能写一个函数,它接受一个参数(一个正整数)并 如果是偶数,则将其除以2,或者 将其乘以3,如果是奇数,则加1 然后返回结果数字 然后是一个单独的函数,它接受一个参数(一个正整数),并将其反复传递给前一个函数,直到它达到1(在该点停止)。函数将返回将其减少到1所需的步骤数 然后是另一个函数,它接受两个参数a和b(都是正整数,aa)执行一次迭代的函数: (define (collatz x) (if (even? x) (/ x 2) (+ (* x 3) 1)))

你能写一个函数,它接受一个参数(一个正整数)并

  • 如果是偶数,则将其除以2,或者
  • 将其乘以3,如果是奇数,则加1
然后返回结果数字

然后是一个单独的函数,它接受一个参数(一个正整数),并将其反复传递给前一个函数,直到它达到1(在该点停止)。函数将返回将其减少到1所需的步骤数


然后是另一个函数,它接受两个参数a和b(都是正整数,aa)执行一次迭代的函数:

(define (collatz x)
  (if (even? x)
      (/ x 2)
      (+ (* x 3) 1)))
此函数接受一个输入并循环,直到达到1。此函数返回达到该状态所需的迭代次数(尝试绘制此图-它看起来很酷):

根据要求,下面是collatz循环的尾部递归版本:

(define (collatz-loop x)
  (define (internal x counter)
    (if (= x 1) counter
    (internal (collatz x) (+ counter 1))))
  (internal x 1))
此函数获取一个范围,并返回到达终点所需的最多步数以及步数:

(define (collatz-range a b)
  (if (= a b)
      (cons a (collatz-loop a))
      (let ((this (collatz-loop a))
        (rest (collatz-range (+ a 1) b)))
        (if (< this (cdr rest)) rest
            (cons a this)))))

(collatz-range 1 20) ; returns (18 . 21), which means that (collatz-loop 18) returns 21
(定义(collatz范围a和b)
(如有)
(cons a(collatz回路a))
(让((这个(collatz循环a))
(其余(科拉茨范围(+a 1)b)))
(如果(
这是collatz范围,尾部递归:

(define (collatz-range a b)
  (define (internal a best)
    (if (< b a) best
        (internal (+ a 1)
        (let ((x (collatz-loop a)))
          (if (< x (cdr best))
              best
              (cons a x))))))
  (internal a (cons -1 -1)))
(定义(collatz范围a和b)
(定义(内部a最佳)
(如果(
对于其他两个函数,使用foldl:

(define (listfrom a b)
  (if (= a b)
      (cons a empty)
      (cons a (listfrom (+ 1 a) b))))

(define (max-collatz a b)
  (foldl max 0 (map collatz-loop (listfrom a b))))

(define (max-collatz-num a b)
  (foldl (lambda (c r)
           (if (> (collatz-loop c) (collatz-loop r)) c r))
         a
         (listfrom a b)))    

我相信这是数论中一个尚未解决的大问题。有一个假设,每一个数经过这个运算足够多的时间后,会减少到一

然而,我并不认为scheme是解决这个问题的合适工具,而且因为很多人认为这是一个家庭作业,而不是一个合法的问题,所以我将用c语言提供我的解决方案

inline unsigned int step(unsigned int i)
{
    return (i&0x1)*(i*3+1)+((i+1)&0x1)*(i>>1);
}
这将对数字执行一步操作(没有分支!!!)。以下是整个计算过程:

unsigned int collatz(unsigned int i)
{
    unsigned int cur = i;
    unsigned steps = 0;
    while((cur=step(cur))!=1) steps++;
    return steps;
}

我不认为完全删除分支是可能的。这是一个数论问题,因此它适合于极端(可能是不必要的)优化。享受

但是我并不认为scheme是解决这个问题的正确工具。怎么会呢?我投票将这个问题作为离题题来结束,因为这是一个家庭作业。
unsigned int collatz(unsigned int i)
{
    unsigned int cur = i;
    unsigned steps = 0;
    while((cur=step(cur))!=1) steps++;
    return steps;
}