递推和递归都是用来解决递归问题的重要方法,主要的区别有:
-
递推是一种迭代的过程,递归是一种递归的过程。
-
递推通过循环逐步扩大问题规模,递归通过函数调用自身来扩大问题规模。
-
递推需要存储中间状态,通过当前状态推导出新状态,递归只需要当前输入。
-
递推的空间复杂度一般较小,递归需要堆栈空间,空间复杂度较大。
-
递推的时间效率一般较高,递归存在大量重复计算,时间效率较低。
-
递推代码较长,递归代码较简洁。
-
递推容易理解逻辑,递归需要展开调用栈来理解。
-
递推可以中途退出,递归必须到达退出条件。
总结一下:
递推通过循环迭代,递归通过自我调用,解决问题的本质思想不同。
递推效率更高,递归代码更简洁。
两者都可以求解递归问题,需要根据具体情况选择合适的方法。
掌握两种方法的区别和适用场景,可以更灵活地解决递归问题。
(来自chatGPT)
---------------------------------------------------------------------------------------------------------------------------------
我们来看递推和递归写斐波那契数列有什么区别:
递推:
long long a[47];
a[1]=a[2]=1;
for(int i=3;i<=46;i++){
a[i]=a[i-1]+a[i-2];
}
cout<<a[40];
递归:
int f(long long a){
if(a==1||a==2)return 1;
else return f(a-1)+f(a-2);
}
递推一般都是用数组来存储小问题的结果,然后通过一番计算得出结果
递归一般都是用函数自己调用自己,调用的自己是用来解决规模较小的问题
也就是说,递推一般用数组存答案,递归一般用函数算答案
---------------------------------------------------------------------------------------------------------------------------------
递归和递推在实现上有些典型的区别:
-
递归通常是通过函数调用自己来实现的。函数内部会调用自身来处理子问题。
-
递推更多是通过数组来保存子问题结果,并通过循环迭代更新数组实现的。
但是,这些只是两种方法的典型实现方式,并不是绝对的区分标准。
递归不一定需要函数自调用,比如可以用栈模拟递归的过程。
递推也可以通过函数参数和返回值传递子问题结果,不一定需要数组。
所以更准确地说:
-
递归的关键是把问题拆分成子问题,通过子问题解决大问题。不一定需要函数自调用。
-
递推的关键是通过当前状态推导新状态。不一定需要数组,可以用其他方式传递状态。
函数自调用和数组只是两种典型的实现手段,不完全等同于递归和递推。
我们需要关注递归和递推的本质思想区别,而不是具体的实现形式。
总之,递归与递推的关键区别在于解决问题的思路,而不仅仅是代码的写法。
(来自chatGPT)
---------------------------------------------------------------------------------------------------------------------------------
看完这篇文章,你知道他们的区别了吗?