递归和动态规划都是把一个大的问题分解成小问题。
区别:
1.递归是从上到下;而动态规划是从下到上。
2.动态规划法又叫做记笔记大法,他会将已经走过的问题的结果都记录在动态规划表中,不会进行重复的运算,但由于要维护动态规划表,所以空间复杂度会很高;
而递归算法很有可能会进行多次重复的运算。比如求9!中 计算 7!和计算 8!都会算到 6!,而这样就会重复计算。
下面举个例子 求n的阶乘:
递归:
int factorial(int n)
{
if (n == 0 || n == 1)
{
return 1;
}
return n * factorial(n - 1); // 从最大的数字开始考虑
}
动态规划法:
int factorial(int n)
{
int dp[100]; // 动态数组的含义:里面放着从 1-n 每一个数字的阶乘
dp[0] = 1;
if (n == 0)
{
return dp[0];
}
for (int i = 1; i <= n ; i++) // 从最小的数字开始考虑,将所有的结果放在数组中
{
dp[i] = i * dp[i - 1];
}
return dp[n];
}