2016-08-15 29 views
-1

我编写代码来查找Collat​​z猜想下需要的数字的操作数。但是,我的操作变量似乎并没有增加。Ruby不增加数字

我的代码是:

puts "Please input a number" 
number = gets.chomp 
number = number.to_i 
operations = 0 
modulo = number % 2 
while number =! 1 
    if modulo == 0 
     number = number/2 
     operations = operations + 1 
    elsif modulo =! 0 && number =! 1 
     number = number * 3 
     number = number += 1 
     operations = operations + 2 
    else 
     puts "Uh oh, something went wrong." 
    end 
end 
puts "It took #{operations} operations!" 

我上https://www.repl.it运行此代码。

+0

您是否收到任何错误? – Wickramaranga

+0

我想@Wickramaranga,会回答你的问题。你的代码只有一些语法错误。 (例如[elseif => elsif],[number = number + = 1 => number + = 1] ...) –

回答

2

首先,它是elsif;不是elseif(我编辑了你的问题)。不等号是!=;不是=!。但是这有一个不同的含义。 (即:number =! 1表示number = !1

在第12行中,number = number += 1是什么?我想你的意思是number += 1number = number + 1

现在,代码有效。 :)

这是最终版本。

puts "Please input a number" 
number = gets.chomp 
number = number.to_i 
operations = 0 
modulo = number % 2 
while number != 1 
    if modulo == 0 
     number = number/2 
     operations = operations + 1 
    elsif modulo != 0 && number != 1 
     number = number * 3 
     number = number + 1 
     operations = operations + 2 
    else 
     puts "Uh oh, something went wrong." 
    end 
end 
puts "It took #{operations} operations!" 

使用方法:

Please input a number 
256 
It took 8 operations! 

的最佳解决方案的功能:

def collatz(n) 
    if n % 2 == 0 
     return n/2 
    else 
     return 3*n + 1 
    end 
end 
def chainLength(num) 
    count = 1 
    while num > 1 
     count += 1 
     num = collatz(num) 
    end 
    return count 
end 

puts "Please input a number" 
number = gets.chomp 
number = number.to_i 
operations = chainLength(number) 
puts "It took #{operations} operations!" 

如果需要更高的性能,了解动态规划记忆化技术。

+0

非常感谢!关于如何优化速度的任何想法? – jBit

+0

@jBit根据您的要求编辑。请注意,这是基于我的旧Python代码之一的仓促翻译。 – Wickramaranga

+0

谢谢你的所有帮助 – jBit