该怎么办?写4a()& 2a()应该是4 * a()还是4 *()而不调用函数?
4a(2 - 1) - 2a(2 - 2) = 4a( 1 ) – 2a( 0 ) = 4
4a(3 - 1) - 2a(3 - 2) = 4a( 2 ) – 2a( 1 ) = 6
4a(4 - 1) - 2a(4 - 2) = 4a( 3 ) – 2a( 2 ) = 8
我这样做是否正确?
php代码:
function a( $x ){
print "a($x) = ";
if( $x == 0 ) return 1;
if( $x == 1 ) return 2;
//if( $x > 1 ) return 4*a( $x - 1)- 2*a( $x - 2); //this line A
//if( $x > 1 ) return 4*( $x - 1)- 2*( $x - 2); //or this line B
}
for( $i=0; $i<10; $i++) print a($i) . "</br>";
对我来说,与B一起使用更有意义,因为它对于一个简单地将输入的内容加倍的功能变得有用。
答案 0 :(得分:0)
问题语句描述了一个递归函数,根据定义,它是一个调用自身的函数。使用0
(即a(0)
k = 0
)进行调用时,结果为1
。使用1
(即a(1)
k = 1
)进行调用时,结果为2
。对于k
大于或等于2
的值,您执行4 * a(k-1) - 2 * a(k-2)
。这是函数调用自身的递归步骤。在这种情况下,它会自己调用两次然后结合答案。
这是Ruby中的。你的答案不正确。
#!/usr/bin/env ruby
def a(k)
return 2 if k == 1
return 1 if k == 0
return 4*a(k-1) - 2*a(k-2)
end
puts "a(2) = #{a(2)}" // prints "a(2) = 6"
puts "a(3) = #{a(3)}" // prints "a(3) = 20"
puts "a(4) = #{a(4)}" // prints "a(4) = 68"
a(0) == 1
和a(1) == 2
是允许递归结束的基本情况。所有其他值都是从具有较小输入的值递归计算的。最终所有内容都以a(0)
或a(1)
结束,然后您只需分别替换1
或2
。
以下是计算机如何解决a(4)
:
a(4) = 4*a(4-1) - 2*a(4-2)
= 4*a(3) - 2*a(2)
= 4*(4*a(2) - 2*a(1)) - 2*a(2)
......以及a(2) = (4*a(1) - 2*a(0))
= 4*(4*(4*a(1) - 2*a(0)) - 2*a(1)) - 2*(4*a(1) - 2*a(0))
= 4*(4*(4* 2 - 2* 1) - 2* 2 ) - 2*(4* 2 - 2* 1 )
= 4*(4*( 8 - 2 ) - 4 ) - 2*( 8 - 2 )
= 4*(4* 6 - 4 ) - 2* 6
= 4*( 24 - 4 ) - 12
= 4* 20 - 12
= 80 - 12
= 68
这就是计算机的作用方式。对于人类而言,在k
的值增加时更容易计算值,因为当我们得到一个已经计算过的值时,我们可以替换该值:
a(0) = 1 // k = 0, so answer is 1
a(1) = 2 // k = 1, so answer is 2
a(2) = 4*a(1) - 2*a(0) = 4*2 - 2*1 = 8 - 2 = 6
a(3) = 4*a(2) - 2*a(1) = 4*6 - 2*2 = 24 - 4 = 20
a(4) = 4*a(3) - 2*a(2) = 4*20 - 2*6 = 80 - 12 = 68