您的位置:首页 > 其它

"100 个台阶"问题的 4 种解法

2007-07-18 08:59 429 查看
[align=left]/*[/align]
[align=left]问题描述:[/align]
[align=left] [/align]
[align=left]100 个台阶, 每次可以走 1 或 2 或 3 个台阶, 走完这 100 个台阶共有多少种走法?[/align]
[align=left] [/align]
[align=left]基本思想:[/align]
[align=left]f(1) = 1;[/align]
[align=left]f(2) = 2;[/align]
[align=left]f(3) = 4;[/align]
[align=left]f(n) = f( n-1 ) 最后一步为 1[/align]
[align=left] + f( n-2 ) 最后一步为 2[/align]
[align=left] + f( n-3 ) 最后一步为 3[/align]
[align=left]*/[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]double recursion1( int n )[/align]
[align=left]{[/align]
[align=left] if( n == 1 )[/align]
[align=left] return 1;[/align]
[align=left] else if( n == 2 )[/align]
[align=left] return 2;[/align]
[align=left] else if( n == 3 )[/align]
[align=left] return 4;[/align]
[align=left] else [/align]
[align=left] {[/align]
[align=left] printf("%5d", n );[/align]
[align=left] return recursion1( n-1 ) + recursion1( n-2 ) + recursion1( n-3 );[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]double recursion2( int n )[/align]
[align=left]{[/align]
[align=left] /* [/align]
[align=left] 算法思想:[/align]
[align=left] 将已经算出的 数保存在 cash[] 中, 每次先在 cash[] 中查找, 如果找到则不再递归, 直接返回结果.[/align]
[align=left] */[/align]
[align=left] static double cash[100] = {0,1,2,4}; [/align]
if( cash
!= 0 )
return cash
;
[align=left] else[/align]
[align=left] {[/align]
[align=left] printf("%5d", n );[/align]
cash
= recursion2( n - 3 ) + recursion2( n-2 ) + recursion2( n-1 );
return cash
;
[align=left] }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]double no_recursion1( int n )[/align]
[align=left]{[/align]
[align=left] if( n == 1 )[/align]
[align=left] return 1;[/align]
[align=left] else if( n == 2 )[/align]
[align=left] return 2;[/align]
[align=left] else if( n == 3 )[/align]
[align=left] return 4;[/align]
[align=left] [/align]
[align=left] double t_3 = 1; // record f( n-3 )[/align]
[align=left] double t_2 = 2; // record f( n-2 )[/align]
[align=left] double t_1 = 4; // record f( n-1 )[/align]
[align=left] double sum = 0;[/align]
[align=left] for( int i = 4; i <= n; i ++ )[/align]
[align=left] {[/align]
[align=left] // f(n) = f( n-1 ) + f( n-2 ) + f( n-3 )[/align]
[align=left] sum = t_1 + t_2 + t_3;[/align]
[align=left] [/align]
[align=left] // update f( n-1 ), f( n-2 ), f( n-3 )[/align]
[align=left] t_3 = t_2;[/align]
[align=left] t_2 = t_1;[/align]
[align=left] t_1 = sum;[/align]
[align=left] }[/align]
[align=left] return sum;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]double ff( int end, int beg = 1 )[/align]
[align=left]{[/align]
[align=left] if( end == 0 || end == 1)[/align]
[align=left] return 1;[/align]
[align=left] [/align]
[align=left] double ss = 1;[/align]
[align=left] for( int i = beg; i <= end ; i ++ )[/align]
[align=left] ss *= i;[/align]
[align=left] return ss;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]double no_recursion2( int nn )[/align]
[align=left]{[/align]
[align=left] /* [/align]
[align=left] 算法思想:[/align]
[align=left] 找出满足 x + 2y + 3z == nn 的所有 x, y, z, 之后问题变成一个重集 B 上的全排列问题:[/align]
[align=left] 其中 B = { x.1, y.2, z.3 }, [/align]
[align=left] 公式为: nn!/( x! * y! * z! )[/align]
[align=left] (此处对阶乘算法没有进一步优化)[/align]
[align=left] */[/align]
[align=left] double sum = 0;[/align]
[align=left] for( int z = 0; z < 34; z ++ )[/align]
[align=left] {[/align]
[align=left] for( int y = 0; y < 51; y ++ )[/align]
[align=left] {[/align]
[align=left] for( int x = 0; x < 101; x ++ )[/align]
[align=left] {[/align]
[align=left] if( x + 2*y + 3*z != nn )[/align]
[align=left] continue;[/align]
[align=left] [/align]
[align=left] // x + 2y + 3z == 100[/align]
[align=left] double t1 = ff( x );[/align]
[align=left] double t2 = ff( y );[/align]
[align=left] double t3 = ff( z );[/align]
[align=left] double t4 = ff( x + y + z );[/align]
[align=left] double tem = t4 / ( t1 * t2 * t3 );[/align]
[align=left] sum += tem;[/align]
[align=left] printf("%5d%5d%5d%50.0f/n", x, y, z, tem );[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] return sum;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]int main()[/align]
[align=left]{[/align]
[align=left] [/align]
[align=left] //double sum = recursion1( 25 ); // 25 is the MAX number that I can bear![/align]
[align=left] double sum = recursion2( 100 );[/align]
[align=left] //double sum = no_recursion1( 100 );[/align]
[align=left] //double sum = no_recursion2( 100 );[/align]
[align=left] [/align]
[align=left] printf("/n/nsum is: %.0f", sum );[/align]
[align=left] printf("/n/nsum is: %.20G/n", sum );[/align]
[align=left] [/align]
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐