函数的定义如何调用自身

我想定义一个函数 f(x) ,函数内部的某个结构会调用函数本身,比如:当 x\geq0 时, f(x)=F(x) ;当 x<0 时, f(x)=G(f(-x)) 。其中,函数 F(x), G(x) 已知。这种函数应当如何定义?

谢谢!

错例:
当我在julia中输入:

f(x::Real)=ifelse(x>=0.0, x, -f(-x))

在运行

f(1.0)

时,系统报如下错误:

StackOverflowError:

Stacktrace:
 [1] f(x::Float64) (repeats 79984 times)
   @ Main ./In[9]:1

不太清楚,看错误信息是出现了死循环…
但是如果写成完整的函数格式就不会报错… 如下

function f(x)
    if x > 1
        return x
    else
        return -f(-x)
    end
end

这不是递归+判断嘛,Julia是支持的。然而这里大概StackOverflow的原因是ifelse:这个函数是无论如何都会先执行两个分支的,和if...else...end的逻辑是不一样的。

谢谢两位,@ LDA111222 @ henry2004y!因为有书上说ifelse函数的效率与if…else…end比会更高,所以我一上来就用了这个函数。没想到还有这个差别。

help?> ifelse
search: ifelse

  ifelse(condition::Bool, x, y)

  Return x if condition is true, otherwise return y. This differs from ? or if in that it is an ordinary function, so
  all the arguments are evaluated first. In some cases, using ifelse instead of an if statement can eliminate the
  branch in generated code and provide higher performance in tight loops.

  Examples
  ≡≡≡≡≡≡≡≡≡≡

  julia> ifelse(1 > 2, 1, 2)
  2

all the arguments are evaluated first

这个就是 ifelse 和 正常的 if 和三元表达式的区别。

看举例,加上常量条件,会被编译器简化掉分支。
很配 @static,在编译器做一些计算。


不过大家貌似就把他当 if-else 的缩写了,还有在两个参数中调用函数的。
这个就反而会更慢了,相当于你执行了所有的分支,然后再根据条件返回结果。
https://juliahub.com/ui/Search?q=ifelse&type=code

谢谢您的回复!我之前的确没去查这个函数,不求甚解就用了这个函数 :sweat:

备案号:京ICP备17009874号-2