Algorithm 计算递归函数
我要计算以下递归函数: 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之间(含)时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(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)