1

I'm trying to use the collatz conjecture (basically divides an even number by 2, and if it's even if multiplies the number by 3 and adds 1) in a functional language (scheme). The obvious solution would be to use remainder to find a 0/1 for even/odd numbers and use an if statement on that for both. BUT, we can't use if statements, conditions, or recurcives. Only what we have learned in module one which is pretty much just basic operations as well as exponents, square roots, etc. Any suggestions?

4

4 回答 4

3

为了避免给我们带来麻烦,我不会直接回答你。我将只讨论数学方面的问题。看问题:

  • 如果是偶数则执行:n/2
  • 如果是奇数则执行:3*n+1;但是,3*n+1 = n/2 + 5/2*n + 1。

所以我们可以将问题改写为:

  • 如果是偶数,则执行:n/2 + (5/2*n + 1) * 0;
  • 如果是奇数,则执行:n/2 + (5/2*n + 1) * 1;

要知道我们何时将剩余部分乘以 0 或 1:您可以使用模函数。

格兰杰!!!

于 2013-09-17T15:32:15.283 回答
1

我不确定您要编写哪种语言,但从数学上讲,这是 Collat​​z 序列的函数。

令 Y 为序列中的下一个数字,X 为当前数字。

Y = (X mod 2) (X/2) + (1 - X mod 2) (3*X+1)

mod是模运算符,A mod B是 的余数A/B,所以X mod 2 = 0暗示X是偶数,X mod 2 = 1暗示X是奇数。

X mod 2我认为是X%2在C中。

于 2013-10-30T15:59:33.473 回答
1

一半或三次加一 ( hotpo) 函数可以用纯数学术语写成如下:

hotpo n = n / 2 + n % 2 * (2.5 * n + 1)

在 Racket 中,您可以按如下方式定义此函数:

(define (hotpo n)
     (+ (/ n 2) (* (remainder n 2) (+ (* 2.5 n) 1))))

对于任何正数n,collat​​z 猜想表明,通过重复应用hotpo来生成数字序列n最终将产生数字1

当然,要测试 collat​​z 猜想,您需要使用递归和条件语句。然而,hotpo函数本身可以用纯数学术语定义,如上所示。

于 2013-09-17T16:00:20.450 回答
0

别骗老子!你可能会因此惹上大麻烦。

但是我可以给你一个提示,考虑这个问题:

如果输入为 1,则返回 2。如果输入为 2,则返回 1。不要使用条件。

答案:f(x) = 3-x

于 2013-09-13T06:04:25.270 回答