• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
小比丘
博客园    首页    新随笔    联系   管理    订阅  订阅
一道人人的笔试题

2012.10.12下午在交大参加的笔试,记得其中一道题大概是:

1 int f(int x,int y)
2 {
3     if(x<0||y<0) return 0;
4     if(x==0||y==0) return 1;
5     return f(x-1,y)+f(x,y-1);
6 }

1)计算f(8,8)的值
2)怎么改进函数,降低时间复杂度?


当时,第一问,直接一步步迭代算,算了半天,没算出来,将中间过程写出来了,第二问,当时想的是应该是将递归改为非递归,但不知道怎么改,没写!


其实这不是在考编程,而是在考数学,再细说,就是在考杨辉三角。以f(3,3)为例,如下图,其展开系数就是杨辉三角的一部分。杨辉三角杨辉三角

对于f(m,n)=C(m+n,n)*f(0,0); C(m+n,n)为组合数。则
1)f(8,8)=C(16,8)*f(0,0)=C(16,8)=12870;
2) 改进思路:将递归改为计算组合数

 1 int Combination(int all,int select){
 2     if(all<=0||select<0||all<select) exit(1);     
 3     if(select==0||select==all) return 1;
 4     if(select==1||select==all-1) return all;
 5     return Combination(all-1,select-1)+Combination(all-1,select);//帕斯卡恒等式
 6 }
 7 
 8 int f2(int x,int y)
 9 {
10     if(x<0||y<0) return 0;
11     if(x==0||y==0) return 1;
12     return Combination(x+y,y);
13 }

组合数的计算参考(转的)计算组合数——整数拆分,笔试题--计算组合数。

posted on 2012-11-14 22:02  小比丘  阅读(527)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3