Algorithm 计算递归函数

Algorithm 计算递归函数,algorithm,recursion,Algorithm,Recursion,我要计算以下递归函数: F(x)=0.25*F(2x),当x介于0和0.5之间(含0.5) F(x)=0.25+0.75*F(2x-1),当x介于0.5和1之间(含)时 另外,F(0)=0,F(1)=1。我不知道如何有效地做到这一点。我想做的是计算一组的F(x),然后画出图。困难的部分是找到函数值。有人能举个例子说明如何处理这种递归函数求值吗?至少有一些参考。请问哪种语言适合这样的任务?如果您只对表格a/2b的输入感兴趣,那么可以定义如下内容 G(a,b)=F(a/2b) 记住这一点,注意因为F

我要计算以下递归函数:

F(x)=0.25*F(2x),当x介于0和0.5之间(含0.5)

F(x)=0.25+0.75*F(2x-1),当x介于0.5和1之间(含)时


另外,F(0)=0,F(1)=1。我不知道如何有效地做到这一点。我想做的是计算一组的F(x),然后画出图。困难的部分是找到函数值。有人能举个例子说明如何处理这种递归函数求值吗?至少有一些参考。请问哪种语言适合这样的任务?

如果您只对表格a/2b的输入感兴趣,那么可以定义如下内容

G(a,b)=F(a/2b)

记住这一点,注意因为F(0)=0和F(1)=1,我们有

G(0,0)=0

G(1,0)=1

现在,自从

F(x)=0.25 F(2x)(如果x≤ (0.5)

我们看到了

G(a,b)=0.25 G(a,b-1)(如果b>0且a≤ 2b-1)

而且,自从

F(x)=0.25+0.75 F(2x-1)(如果x≥ (0.5)

我们看到了

G(a,b)=0.25+0.75 G(a-2b-1,b-1)*(如果b>0且a≥ 2b-1)

总的来说,我们现在必须解决这个问题:

G(0,0)=0

G(1,0)=1

G(a,b)=0.25 G(a,b-1),如果a≤ 2b-1

G(a,b)=0.25+0.75 G(a-2b-1,b-1),否则

因此,为了计算F(a/2b),您可以通过简单地展开上述递推关系来计算时间O(b)

当然,这里有一个问题,是否有一个更清晰的解释来解释这里发生了什么。基于我们将单位间隔划分为[0,1/2]和[1/2,1]范围的事实,从二进制表示的角度来看数字x可能没有什么坏处。让我们看看如果我们那样做会发生什么

如果x只有一位长,则为0或1,我们可以直接计算:

F(0)=0

F(1)=1

现在,假设x具有二进制表示。0.b0b1…bn。注意

2x=b0.b1b2…bn

这非常方便,因为如果我们这样做的话,递归的效果会非常好。例如,如果b0=0,则我们取第一个分支:

F(0.0b1b2…bn)=0.25f(0.b1…bn)

否则,b0=1,我们取第二个分支:

(0.1亿欧元)=0.25+0.75亿欧元(0.1亿欧元)

这可以在时间O(n)中计算,其中n是数字表示中的位数(这与上面的时间范围相匹配,因为上面的分母b是我们的数字n。毕竟,我们在这里所做的只是更改表示)

我还没有深入研究在你尝试评估这种复发时会出现什么样的模式,但如果我发现了什么,我会更新这个答案


希望这有帮助

如果您只对表格a/2b的输入感兴趣,那么定义以下内容可能会有所帮助

G(a,b)=F(a/2b)

记住这一点,注意因为F(0)=0和F(1)=1,我们有

G(0,0)=0

G(1,0)=1

现在,自从

F(x)=0.25 F(2x)(如果x≤ (0.5)

我们看到了

G(a,b)=0.25 G(a,b-1)(如果b>0且a≤ 2b-1)

而且,自从

F(x)=0.25+0.75 F(2x-1)(如果x≥ (0.5)

我们看到了

G(a,b)=0.25+0.75 G(a-2b-1,b-1)*(如果b>0且a≥ 2b-1)

总的来说,我们现在必须解决这个问题:

G(0,0)=0

G(1,0)=1

G(a,b)=0.25 G(a,b-1),如果a≤ 2b-1

G(a,b)=0.25+0.75 G(a-2b-1,b-1),否则

因此,为了计算F(a/2b),您可以通过简单地展开上述递推关系来计算时间O(b)

当然,这里有一个问题,是否有一个更清晰的解释来解释这里发生了什么。基于我们将单位间隔划分为[0,1/2]和[1/2,1]范围的事实,从二进制表示的角度来看数字x可能没有什么坏处。让我们看看如果我们那样做会发生什么

如果x只有一位长,则为0或1,我们可以直接计算:

F(0)=0

F(1)=1

现在,假设x具有二进制表示。0.b0b1…bn。注意

2x=b0.b1b2…bn

这非常方便,因为如果我们这样做的话,递归的效果会非常好。例如,如果b0=0,则我们取第一个分支:

F(0.0b1b2…bn)=0.25f(0.b1…bn)

否则,b0=1,我们取第二个分支:

(0.1亿欧元)=0.25+0.75亿欧元(0.1亿欧元)

这可以在时间O(n)中计算,其中n是数字表示中的位数(这与上面的时间范围相匹配,因为上面的分母b是我们的数字n。毕竟,我们在这里所做的只是更改表示)

我还没有深入研究在你尝试评估这种复发时会出现什么样的模式,但如果我发现了什么,我会更新这个答案


希望这有帮助

在Ruby中实现非常简单,它有一个内置的
Rational
类,所以给定二元数时,数值舍入问题不会困扰您

ONE_HALF = Rational(1,2)
ONE_QUARTER = Rational(1,4)
THREE_QUARTERS = Rational(3,4)

def f(r)
  r = r.to_r  # ensure r is a rational
  if r == 0
    return 0
  elsif r == 1
    return 1
  elsif r <= ONE_HALF
    return ONE_QUARTER * f(2 * r)
  else
    return ONE_QUARTER + THREE_QUARTERS * f(2 * r - 1)
  end
end

p f(Rational(0))          # => 0
p f(Rational(1))          # => 1
p f(Rational(1,2))        # => (1/4)
p f(Rational(1,4))        # => (1/16)
p f(Rational(3,4))        # => (7/16)
p f(Rational(47,1024))    # => (1549/1048576)
ONE_HALF=Rational(1,2)
四分之一=合理(1,4)
四分之三=合理(3,4)
def f(r)
r=r。确保r是一个有理数
如果r==0
返回0
如果r==1
返回1
埃尔西夫r0
pf(有理(1))#=>1
pf(有理(1,2))#=>(1/4)
pf(有理(1,4))#=>(1/16)
pf(有理(3,4))#=>(7/16)
p f(有理数(471024))#=>(1549/1048576)

在Ruby中实现起来很简单,它有一个内置的
Rational
类,所以数字舍入问题不会困扰给定的二元数

ONE_HALF = Rational(1,2)
ONE_QUARTER = Rational(1,4)
THREE_QUARTERS = Rational(3,4)

def f(r)
  r = r.to_r  # ensure r is a rational
  if r == 0
    return 0
  elsif r == 1
    return 1
  elsif r <= ONE_HALF
    return ONE_QUARTER * f(2 * r)
  else
    return ONE_QUARTER + THREE_QUARTERS * f(2 * r - 1)
  end
end

p f(Rational(0))          # => 0
p f(Rational(1))          # => 1
p f(Rational(1,2))        # => (1/4)
p f(Rational(1,4))        # => (1/16)
p f(Rational(3,4))        # => (7/16)
p f(Rational(47,1024))    # => (1549/1048576)
ONE_HALF=Rational(1,2)
四分之一=合理(1,4)
四分之三=合理(3,4)
def f(r)
r=r。确保r是一个有理数
如果r==0
返回0
如果r==1
返回1
埃尔西夫r0
pf(有理(1))#=>1
pf(有理(1,2)