计算递归函数的值

时间:2015-05-17 09:49:06

标签: php function math recursion

该怎么办?写4a()& 2a()应该是4 * a()还是4 *()而不调用函数?

Function

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一起使用更有意义,因为它对于一个简单地将输入的内容加倍的功能变得有用。

1 个答案:

答案 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) == 1a(1) == 2是允许递归结束的基本情况。所有其他值都是从具有较小输入的值递归计算的。最终所有内容都以a(0)a(1)结束,然后您只需分别替换12

以下是计算机如何解决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