Ruby 意外的$end after while循环和嵌套if
我有一个我正在做的程序,它应该是求前1000个素数的和。目前,我所关心的是确保程序能够找到前1000个素数,我将在以后添加添加这些素数的功能。以下是我所拥有的:Ruby 意外的$end after while循环和嵌套if,ruby,Ruby,我有一个我正在做的程序,它应该是求前1000个素数的和。目前,我所关心的是确保程序能够找到前1000个素数,我将在以后添加添加这些素数的功能。以下是我所拥有的: #!/usr/bin/ruby def prime(num) is_prime = true for i in 2..Math.sqrt(num) if (num % i) == 0 is_prime = false else
#!/usr/bin/ruby
def prime(num)
is_prime = true
for i in 2..Math.sqrt(num)
if (num % i) == 0
is_prime = false
else
is_prime = true
end
end
return is_prime
end
i = 2
number_of_primes = 0
while number_of_primes < 1000
prime = prime(i)
if prime == true
number_of_primes++
end
i++
end
有什么好处?任何方向都值得赞赏 Ruby没有
++
操作符,您需要执行+=1
number_of_primes += 1
Ruby没有
++
操作符,您需要执行+=1
number_of_primes += 1
未经询问,但如果您感兴趣,请提供几条建议: Ruby最酷的一点是,问号在方法名中是合法的。因此,您经常会发现“predicate”方法(测试某些内容并返回true或false的方法)以问号结尾,例如:
odd?
。您的prime
方法非常适合于此,因此我们可以将其重命名为prime?
你可以使用一个局部变量,is_prime
,来判断你是否找到了你正在测试的数字的一个因子——这是你在java或C这样的命令式语言中应该做的事情——但是Ruby具有函数式编程的各种很酷的特性,你可以通过学习获得强大的功能和表达能力。如果您以前没有遇到过它们,您可能需要在google上搜索什么是块以及语法是如何工作的,但是出于这个目的,您可以将其视为在集合的每个项目上运行一些代码的一种方式。它可以与多种很酷的方法一起使用,其中一种方法非常适合您的目的:none?
,如果在集合中没有调用它的项,则返回true,当传递到您给出的代码块时,返回true。因此您的prime?
方法可以这样重写:
def prime? num
(2..Math.sqrt(num)).none? { |x| num % x == 0 }
end
除了较短之外,不需要使用局部变量(如is_prime
)的优点是,引入错误的机会较少-例如,如果您认为is_prime
的内容是一回事,但实际上是另一回事。如果你仔细看的话,它也更接近质数的实际数学定义。因此,通过删除不必要的代码,您可以更接近于暴露您所写内容的“意义”
就获得前1000个素数而言,无限流是一种非常酷的方法,但这里的解释可能有点复杂-如果你感兴趣,肯定是谷歌,因为它们真的很棒!但是出于兴趣,这里有一个简单的方法,你可以使用递归而不使用局部变量(记住局部变量是魔鬼!)
就总结而言,我要说的就是搜索一个名为inject
——也称为reduce
的ruby方法。如果你以前没有接触过这个概念,一开始可能会有点大脑弯曲,但这很值得学习!非常酷,非常强大
玩得开心 未经询问,但如果您感兴趣,请提供几条建议:
Ruby最酷的一点是,问号在方法名中是合法的。因此,您经常会发现“predicate”方法(测试某些内容并返回true或false的方法)以问号结尾,例如:odd?
。您的prime
方法非常适合于此,因此我们可以将其重命名为prime?
你可以使用一个局部变量,is_prime
,来判断你是否找到了你正在测试的数字的一个因子——这是你在java或C这样的命令式语言中应该做的事情——但是Ruby具有函数式编程的各种很酷的特性,你可以通过学习获得强大的功能和表达能力。如果您以前没有遇到过它们,您可能需要在google上搜索什么是块以及语法是如何工作的,但是出于这个目的,您可以将其视为在集合的每个项目上运行一些代码的一种方式。它可以与多种很酷的方法一起使用,其中一种方法非常适合您的目的:none?
,如果在集合中没有调用它的项,则返回true,当传递到您给出的代码块时,返回true。因此您的prime?
方法可以这样重写:
def prime? num
(2..Math.sqrt(num)).none? { |x| num % x == 0 }
end
除了较短之外,不需要使用局部变量(如is_prime
)的优点是,引入错误的机会较少-例如,如果您认为is_prime
的内容是一回事,但实际上是另一回事。如果你仔细看的话,它也更接近质数的实际数学定义。因此,通过删除不必要的代码,您可以更接近于暴露您所写内容的“意义”
就获得前1000个素数而言,无限流是一种非常酷的方法,但这里的解释可能有点复杂-如果你感兴趣,肯定是谷歌,因为它们真的很棒!但是出于兴趣,这里有一个简单的方法,你可以使用递归而不使用局部变量(记住局部变量是魔鬼!)
就总结而言,我要说的就是搜索一个名为inject
——也称为reduce
的ruby方法。如果你以前没有接触过这个概念,一开始可能会有点大脑弯曲,但这很值得学习!非常酷,非常强大
玩得开心 ruby不懂“++”。。使用素数的个数+=1 Ruby不理解“++”。。使用素数+=1一些建议,我很感谢您的回复。我肯定会更深入地研究。我是ruby语言的新手,到目前为止,这是一次有趣的学习经历,所以很高兴看到一些ruby可以做的事情,而Java却做不到。太好了,很高兴能提供帮助!你用Ruby选了一门好语言。非常有趣