阿管百度之行后,记载楼梯算法相关:
题目大家都知道,大致为:
一个共有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.如果说要展示出所有的情况的递归方法:
1 function up_out($n)
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.展示所有情况的非递归方法:
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));