2016-08-15 92 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