|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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)
难点在于我们怎么来抽象这些条件,这些东西是数学的东西 很不容易理解。
定律:当在算法上遇到问题的时候,不理解为何这样的时候,请翻看对应的数学
比如 这个算法:整数划分问题,就是排列 组合 的数学问题。
|
|