免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3582 | 回复: 18

征求高效算法 [复制链接]

论坛徽章:
0
发表于 2006-02-11 10:47 |显示全部楼层
大家好,我有如下题:
     已知:
         A(m, n) = n + 1                             当 m = 0 时
         A(m, n) = A(m – 1, 1)                    当m ! = 0 且 n = 0 时
         A(m, n) = A(m – 1, A(m, n - 1))     当m ! = 0 且 n ! = 0 时

     编程求解: A(6, 4)

粗略想一下,感觉就是一个递归嘛,写个简单思路,但好像运行需要很长时间,望各位能写个高效算法,小弟先谢过:)
#include <stdio.h>
int func( int m , int n )
{
    if( 0 == m )
{
    return n+1;   //递归出口
}
   else
  {
      if ( 0 == n )
     {
        return func( m-1, 1 );
     }
  else
   {
    int b;
    b = func( m, n-1 );
    return func( m-1, b );
   }
  }
}

int  main()
{
    int a;
    a = func( 6, 4 );
    printf(“A( 6, 4 ) = %d ”, a );
    return 0;
}

论坛徽章:
0
发表于 2006-02-11 13:48 |显示全部楼层

本题是一个著名外资企业的笔试题目

这是某著名外资企业的笔试题目,上述算法会造成segment fault,即使改成long类型也不知道要运行到何年何月才出结果,所以恳请大家想个高效算法,不胜感激

论坛徽章:
0
发表于 2006-02-11 14:49 |显示全部楼层
按道理是这样写的,

我算了一下,
a(1,n)=n+2
a(2,n)=(n+1)*2+1
a(3,n)=a(3,n-1)*2+3

a(4,n)几乎就没法算了,
a(4,0)=13
a(4,1)=65533

更不用说a(5,n),a(6,n)了。

论坛徽章:
0
发表于 2006-02-11 15:30 |显示全部楼层

是天文数字吧

在A(0,n) {n| 0,1,2,3...} 是 A是1, 2,3,4....n+1的序列
在 A(1,n)  A是 an=2,3,...n+2的数列
在A(2,n) A是3,5,.....2(n+1)+1的数列
在A(3,n) A是5,13,... an=a(n-1)+8^(2^n-1); a0=5

*在A(4,n) 不知道了 但是A(4,0)=13,  
                                  A(4,1) = 65533 == A(3,13)
因为
a(m,n) = a(m-1,a(m-1,a(m-1,...a(m,0)...)
当m = 4, 时 a(4, n) = a(3,a(3,.....a(4,0)..)
当n = 2 时 a(4,2) = a(3,a(3,a(4,0))) = a(3,a(3,13))=a(3,65533);
已经太大了 double 都溢出

不知道对不对 请指正

我想最好有高手归纳出通式来

论坛徽章:
0
发表于 2006-02-11 15:41 |显示全部楼层
应该没公式的。

论坛徽章:
0
发表于 2006-02-11 15:43 |显示全部楼层
我写了一个函数,效率方面,肯定要比楼主的要高很多,但也没法解决问题,

先看看代码:





  1. #include <stdio.h>

  2. long a[10][300];
  3. long count=0;
  4. long func(long m,long n)
  5. {
  6. count++;
  7. if (m==0)
  8. {
  9.         a[m][n]=n+1;
  10.         return n+1;
  11. }
  12. else
  13. {
  14. if (n==0)
  15. {
  16.         if (a[m-1][1]>0)
  17.         {
  18.         return a[m-1][1];
  19.         }
  20.         else
  21.         {
  22.         a[m-1][1]=func(m-1,1);
  23.         return a[m-1][1];
  24.         }
  25. }
  26. else
  27. {
  28.         if (a[m][n-1]<0)
  29.         {
  30.         a[m][n-1]=func(m,n-1);
  31.         }
  32.         if (a[m-1][a[m][n-1]]>0)
  33.         {
  34.         return a[m-1][a[m][n-1]];
  35.         }
  36.         else
  37.         {
  38.         a[m-1][a[m][n-1]]=func(m-1,a[m][n-1]);
  39.         return a[m-1][a[m][n-1]];
  40.         }
  41. }
  42. }
  43. }

  44. int main()
  45. {
  46. long i,k;
  47. for (i=0;i<11;i++)
  48. for (k=0;k<301;k++)
  49. {
  50. a[i][k]=-1;
  51. }
  52. k=3;
  53. i=5;
  54. printf("A(%ld,%ld)=%ld \n",k,i,func(k,i));
  55. printf("count:%ld\n",count);
  56. return 0;
  57. }




复制代码

论坛徽章:
0
发表于 2006-02-11 15:47 |显示全部楼层
上面算法的主要思想是用数组来存放计算过的A(m,n),以免A(m,n)计算多次,

按这算法,比楼主写的效率要高很多,
比如计算A(3,4),楼主的算法需递归42438次,我的算法只需递归636次,

但这样仍不能解决问题。

论坛徽章:
0
发表于 2006-02-11 15:50 |显示全部楼层

謝謝各位

嗯,好像用递归的方式不能解决问题了,多谢大家!

论坛徽章:
0
发表于 2006-02-11 15:54 |显示全部楼层
原帖由 shock_bn 于 2006-2-11 15:50 发表
嗯,好像用递归的方式不能解决问题了,多谢大家!


这问题,只有用递归了,

只是这算法有些变态罢了,a(4,1)就65533,那a(6,4)估计是个天文数字。

论坛徽章:
0
发表于 2006-02-11 15:55 |显示全部楼层
好,那我用long long试一下看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP