zoukankan      html  css  js  c++  java
  • 一道人人的笔试题

    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 }

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

  • 相关阅读:
    17. 电话号码的字母组合
    12. 整数转罗马数字
    01-正则表达式基础
    前端SEO技巧
    node.js
    Vue.生命周期
    Vue小案例--过滤器的基本操作
    vue简单的计算器
    VSCode 自动刷新
    Vue.js学习
  • 原文地址:https://www.cnblogs.com/emituofo/p/2770665.html
Copyright © 2011-2022 走看看