阿管百度之行后,记载楼梯算法相关:
题目大家都知道,大致为:
一个共有N个台阶的楼梯,从下面走到上面。一次只能迈一个台阶或两个台阶,并且不能后退,走完这个楼梯共有多少种方法?
1. 递归方法
1
//
php
2 function up( $n )
3 {
4 if ( $n == 2 )
5 return 2 ;
6 elseif ( $n == 1 )
7 return 1 ;
8
9 return up( $n - 1 ) + up( $n - 2 );
10 }
11 echo up( 10 );
2 function up( $n )
3 {
4 if ( $n == 2 )
5 return 2 ;
6 elseif ( $n == 1 )
7 return 1 ;
8
9 return up( $n - 1 ) + up( $n - 2 );
10 }
11 echo up( 10 );
2.非递归方法
1
function
up(
$n
)
2 {
3 $a = array ( 1 , 2 );
4 for ( $i = 3 ; $i <= $n ; $i ++ ){
5 $a [ $i ] = $a [ $i - 1 ] + $a [ $i - 2 ];
6 }
7 print_r ( $a );
8 }
9 up(10);
2 {
3 $a = array ( 1 , 2 );
4 for ( $i = 3 ; $i <= $n ; $i ++ ){
5 $a [ $i ] = $a [ $i - 1 ] + $a [ $i - 2 ];
6 }
7 print_r ( $a );
8 }
9 up(10);
3.如果说要展示出所有的情况的递归方法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
2
{
3 if ( $n == 1 )
4 return array ( ' 1 ' );
5 else if ( $n == 2 )
6 return array ( ' 1 1 ' , ' 2 ' );
7 return array_merge (lian(up_out( $n - 1 ) , ' 1 ' ) , lian(up_out( $n - 2 ) , ' 2 ' ));
8 }
9 function lian( $a1 , $a2 )
10 {
11 foreach ( $a1 as & $a1_v ) {
12 $a1_v = $a1_v . $a2 ;
13 }
14 return $a1 ;
15 }
16 print_r (up_out( 10 ));
3 if ( $n == 1 )
4 return array ( ' 1 ' );
5 else if ( $n == 2 )
6 return array ( ' 1 1 ' , ' 2 ' );
7 return array_merge (lian(up_out( $n - 1 ) , ' 1 ' ) , lian(up_out( $n - 2 ) , ' 2 ' ));
8 }
9 function lian( $a1 , $a2 )
10 {
11 foreach ( $a1 as & $a1_v ) {
12 $a1_v = $a1_v . $a2 ;
13 }
14 return $a1 ;
15 }
16 print_r (up_out( 10 ));
4.展示所有情况的非递归方法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1
function
up_out(
$n
)
2 {
3 $re = array ( array ( 0 ) , array ( ' 1 ' ) , array ( ' 1 1 ' , ' 2 ' ));
4 for ( $i = 3 ; $i <= $n ; $i ++ ) {
5 $re [ $i ] = array_merge (lian( $re [ $i - 1 ] , ' 1 ' ) , lian( $re [ $i - 2 ] , ' 2 ' ));
6 }
7 return $re ;
8 }
9 function lian( $a1 , $a2 ) {
10 foreach ( $a1 as & $a_v ) {
11 $a_v = $a_v . $a2 ;
12 }
13 return $a1 ;
14 }
15 print_r (up_out( 10 ));
2 {
3 $re = array ( array ( 0 ) , array ( ' 1 ' ) , array ( ' 1 1 ' , ' 2 ' ));
4 for ( $i = 3 ; $i <= $n ; $i ++ ) {
5 $re [ $i ] = array_merge (lian( $re [ $i - 1 ] , ' 1 ' ) , lian( $re [ $i - 2 ] , ' 2 ' ));
6 }
7 return $re ;
8 }
9 function lian( $a1 , $a2 ) {
10 foreach ( $a1 as & $a_v ) {
11 $a_v = $a_v . $a2 ;
12 }
13 return $a1 ;
14 }
15 print_r (up_out( 10 ));