在Julia中使用平方根函数的不可预测的行为

时间:2018-02-19 05:17:12

标签: 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.")
                break
            else i>=0
                println(sqrt.(i))
            end
        end
    end 

当我将函数用于有效范围时,会出现问题。例如,当我调用函数范围(0,9)时,我得到了这个:

square(0,9)

0.0
1.0
1.4142135623730951
1.7320508075688772
2.0
2.23606797749979
2.449489742783178
2.6457513110645907
2.8284271247461903

然后,当我呼吁

square(2,9)

1.4142135623730951
1.7320508075688772
2.0
2.23606797749979
2.449489742783178
2.6457513110645907
2.8284271247461903
3.0
3.1622776601683795

我尝试了很多组合,只是在少数情况下,该功能按预期工作(例如范围为1:9)。 有人可以解释一下我做错了什么,我该如何解决这个问题呢? 任何帮助将不胜感激

3 个答案:

答案 0 :(得分:4)

正如@Fredrik Bagge在评论中提到的那样,range(x,y)并没有按照您的意愿行事。通过?range查看文档,我们看到了

range(start, [step], length)
     

根据起始值和可选步骤(默认为1),按长度构造范围。

因此第二个整数参数指定范围的长度而不是端点。您要使用的是start:step:range语法或linspace(start, 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 

但是,sqrt.(i)中的广播没有多大意义,因为i是一个数字。我可能宁愿做这样的事情

function square2(x::Int,y::Int)
    (x<0 || y<0) && error("You can't enter non-negative numbers. Please enter a valid number for x.")
    sqrt.(linspace(x,y,10))
end 

注意pull request range方法已对linspace方法进行了全面检查,并且对于Julia 0.7已弃用class NotificationsController < ApplicationController def mynotifications @u_notifications_paginate = current_user.notifications.all.order('created_at DESC').paginate(:page => params[:page], :per_page => 10) @u_notifications_paginate.update read: true end def destroy if current_user notif = current_user.notifications.find_by_notification_uid!(params[:id]) notif.destroy redirect_to mynotifications_path(locale: I18n.locale) else redirect_to root_path(locale: I18n.locale) end end end

答案 1 :(得分:0)

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

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 

答案 2 :(得分:-3)

在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)