你知道怎么写这个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
然后是另一个函数,它接受两个参数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;
}