鱼C论坛

 找回密码
 立即注册
查看: 2764|回复: 0

据哥察觉,大部分人以为算法就是那么回事,你们都错了。

[复制链接]
发表于 2012-9-22 22:50:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近,在算法上面卡脑壳了,迭代和递归这个问题,看似简单的东西,在实际数学模型中,真的是很难的,别以为自己看那几个变量 一个算法没什么,举个列子
#include <stdio.h>

   int split(int n, int m)
   {
      if(n < 1 || m < 1) return 0;
      if(n == 1 || m == 1) return 1;
      if(n < m) return split(n, n);
      if(n == m) return (split(n, m - 1) + 1);
      if(n > m) return (split(n, m - 1) +split((n - m), m));
  }

int main()
{
     printf("6的划分数: %d", split(6, 6));//仔细看这里 是通过一个输出 调用2个形参
    return 0;
}这是一个整数划分的问题,是不是觉得简单啊?如果你这样想 那说明你连C门都还没入哈,我一个朋友屌丝的给她看了下,2分钟后回答很简单,还洗我脑壳。

让我们仔细分析上面条件的判断,是一个二维递归,
(1) m > n
    在整数划分中实际上最大加数不能大于n,因此在这种情况可以等价为split(n, n);
    可用程序表示为if(m > n) return split(n, n);   
    (2) m = n
    这种情况可用递归表示为split(n, m - 1) + 1,从以上例子中可以看出,就是最大加
    数为6和小于6的划分之和
    用程序表示为if(m == n) return (split(n, m - 1) + 1);
    (3) m < n
    这是最一般的情况,在划分的大多数时都是这种情况。
    从上例可以看出,设m = 4,那split(6, 4)的值是最大加数小于4划分数和整数2的划分数的和。
    因此,split(n, m)可表示为split(n, m - 1) + split(n - m, m)
    难点在于我们怎么来抽象这些条件,这些东西是数学的东西 很不容易理解。
定律:当在算法上遇到问题的时候,不理解为何这样的时候,请翻看对应的数学
比如 这个算法:整数划分问题,就是排列 组合 的数学问题。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-29 14:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表