Function Julia中平方根函数的不可预测行为

Function Julia中平方根函数的不可预测行为,function,for-loop,functional-programming,julia,Function,For Loop,Functional Programming,Julia,我做了一个简单的函数,计算给定范围内的数字的平方根。如果x为负,则函数停止并抛出错误消息。代码如下: function square(x::Int,y::Int) for i in range(x,y) if i< 0 print("You can't enter non-negative numbers. Please enter a valid number for x.")

我做了一个简单的函数,计算给定范围内的数字的平方根。如果x为负,则函数停止并抛出错误消息。代码如下:

   function square(x::Int,y::Int) 
        for i in range(x,y)
            if i< 0
                print("You can't enter non-negative numbers. Please enter a valid number for x.")
                break
            else i>=0
                println(sqrt.(i))
            end
        end
    end 
然后,当我要求

square(2,9)

1.4142135623730951
1.7320508075688772
2.0
2.23606797749979
2.449489742783178
2.6457513110645907
2.8284271247461903
3.0
3.1622776601683795
我尝试了这么多的组合,只有在少数情况下,该函数才能如预期的那样工作,例如范围为1:9。 有人能解释一下我做错了什么,我怎样才能解决这个问题吗?
如@Fredrik Bagge在评论中提到,rangex,y没有做你期望的事情,任何帮助都将不胜感激。通过?范围查看文档,我们可以看到

给定起始值和可选步长,按长度构造范围默认为1

因此,第二个整数参数指定范围的长度,而不是端点。您要使用的是start:step:range语法或linspacestart、stop、numberofpoints

例如,如果将后者与numberofpoints=10一起使用,则函数将读取

function square(x::Int,y::Int) 
    for i in linspace(x,y,10)
        if i< 0
            print("You can't enter non-negative numbers. Please enter a valid number for x.")
            break
        else i>=0
            println(sqrt.(i))
        end
    end
end 

请注意,在此版本中,范围方法已被彻底修改,linspace已被弃用用于Julia 0.7。

在Julia collect中,范围在Python和R等语言中可用。也许解决方案不那么优雅,但工作正常:

   function square(x::Int,y::Int) 
        for i in collect(x:y)
            if i< 0
                print("You can't enter non-negative numbers. Please enter a valid number for x.")
                break
            else i>=0
                return sqrt.(collect(x:y))
            end
        end
    end 

square(1,25)

我不太明白为什么要写这样的函数。你可以直接写

sqrt.(x:y)
就用这个。如果需要以某种特定方式将数字打印到屏幕上,请执行以下操作:

function square(x::Int,y::Int) 
    for i in x:y
        if i < 0
            println("You can't enter non-negative numbers. Please enter a valid number for x.")
            return
        else
           println(sqrt(i))
        end
    end
end 

如果只对整数进行迭代,Union{Float64,Int}为您实现了什么。我更改了参数的类型,问题仍然存在。函数范围是否达到了预期效果?第二个参数似乎指定了值的数量,而不是终点。本文对此进行了一些讨论,请注意,您的编辑确实不正确。collect函数无法解决问题,与您的问题无关。重要的是,您从rangex,y切换到了x:y,顺便说一句,我在回答中提到了start:step:stop。即使不调用collect,您的代码也将按预期工作。事实上,收集不应该在这里使用,因为你不应该收集,即分配整个单位范围只是为了迭代它。一般来说,如果你认为已经找到了你自己的问题的答案,你应该考虑把它作为一个答案,而不是编辑你原来的问题。这更透明,允许人们直接投票和评论你的答案。如果你认为自己给出的答案是最好的,它也会让你接受自己的答案。谢谢你的观察。我现在就做。这个答案完全误解了前面的评论和答案。您不应该使用collect,使用迭代变量i,然后在语句return sqrt中忽略它是没有意义的。collectx:i需要一个函数,它返回一对数字X-sqrtX,以便绘制它们。为什么需要一个函数来实现这一点?你就不能做plotx,sqrt.x吗?这是我参加的在线课程的作业。他们要求我们写一个函数,然后画出结果。听起来像是一个奇怪的任务,但有点难说。祝你好运
   function square(x::Int,y::Int) 
        for i in collect(x:y)
            if i< 0
                print("You can't enter non-negative numbers. Please enter a valid number for x.")
                break
            else i>=0
                return sqrt.(collect(x:y))
            end
        end
    end 

square(1,25)
sqrt.(x:y)
function square(x::Int,y::Int) 
    for i in x:y
        if i < 0
            println("You can't enter non-negative numbers. Please enter a valid number for x.")
            return
        else
           println(sqrt(i))
        end
    end
end