我正在尝试使用collatz猜想(基本上将偶数除以2,如果它甚至将数字乘以3并加1)在函数式语言(方案)中。显而易见的解决方案是使用余数来找到偶数/奇数的0/1,并对其使用if语句。但是,我们不能使用if语句,条件或recurcives。只有我们在模块一中学到的东西,它几乎只是基本操作以及指数,平方根等。有什么建议吗?
答案 0 :(得分:3)
为了避免我们的问题,我不会给你直接的回答。我将在数学方面进行讨论。 看看问题:
所以我们可以将问题重写为:
要知道何时将剩余部分乘以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
,使用collatz猜想指出,通过重复应用hotpo
到n
生成一系列数字最终会产生数字1
。
当然,为了测试collatz猜想,你需要使用递归和条件语句。但是,hotpo
函数本身可以用纯数学术语定义,如上所示。
答案 2 :(得分:1)
我不确定您希望编码哪种语言,但从数学上讲,这是Collatz序列的功能。
设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
我认为在C中是X%2
。
答案 3 :(得分:0)
不要欺骗老兄!你可能会遇到大麻烦。
但是我可以给你一个提示,考虑一下这个问题:
如果输入为1,则返回2.如果输入为2,则返回1.不要使用条件。
答案:f(x)= 3-x