没有if语句如何使用collat​​z猜想?

时间:2013-09-13 03:39:17

标签: scheme racket collatz

我正在尝试使用collat​​z猜想(基本上将偶数除以2,如果它甚至将数字乘以3并加1)在函数式语言(方案)中。显而易见的解决方案是使用余数来找到偶数/奇数的0/1,并对其使用if语句。但是,我们不能使用if语句,条件或recurcives。只有我们在模块一中学到的东西,它几乎只是基本操作以及指数,平方根等。有什么建议吗?

4 个答案:

答案 0 :(得分: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:您可以使用模数函数。

Grangle !!!

答案 1 :(得分: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猜想指出,通过重复应用hotpon生成一系列数字最终会产生数字1

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

答案 2 :(得分:1)

我不确定您希望编码哪种语言,但从数学上讲,这是Collat​​z序列的功能。

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

  

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

mod是模运算符,A mod BA/B的余数,因此X mod 2 = 0表示X是偶数且X mod 2 = 1暗示X是奇数。

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

答案 3 :(得分:0)

不要欺骗老兄!你可能会遇到大麻烦。

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

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

答案:f(x)= 3-x