C++递归和迭代的区别,并举例说明[通俗易懂]

C++递归和迭代的区别,并举例说明[通俗易懂]递归:函数自己重复调用自己迭代:利用变量的原值推算出变量的一个新值;A不停的调用B例子一:斐波那契数递归(recursion):#include#includeusingnamespacestd;intfab(intn){if(n==0)return0;if(n==1)return1;if(n>1)returnfab(n-1)+fab(n-2);}intmain(){cout<<fab(4)<

大家好,又见面了,我是你们的朋友全栈君。

递归:函数自己重复调用自己
迭代:利用变量的原值推算出变量的一个新值;A不停的调用B
例子一:斐波那契数
递归(recursion):

#include <iostream>
#include <vector>
using namespace std;
int fab(int n)
{ 
   
    if (n == 0)
        return 0;
    if (n == 1)
        return 1;
    if (n > 1)
        return fab(n - 1) + fab(n - 2);
}
int main()
{ 
   
    cout << fab(4) << endl;
    return 0;
}

迭代(iteration):

#include <iostream>
#include <vector>
using namespace std;
int fab(int n)
{ 
   
    int a = 0, b = 1, c = 1;
    if (n == 0)
        return 0;
    if (n == 1)
        return 1;
    while (n > 1)
    { 
   
        c = a + b;
        a = b;
        b = c;
        n--;
    }
    return c;
}
int main()
{ 
   
    cout << fab(4) << endl;
    return 0;
}

例子二:反转链表
递归(recursion):

#include <iostream>
#include <vector>
using namespace std;
struct ListNode
{ 
   
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) { 
   }
};
ListNode *reverseList(ListNode *head, ListNode *pre)
{ 
   
    if (!head)
        return NULL;
    if (!head->next)
    { 
   
        head->next = pre;
        return head;
    }
    ListNode *temp = head->next;
    head->next = pre;
    pre = head; //pre其实是往后移一个
    return reverseList(temp, pre);
}
ListNode *createNodeList(vector<int> &vec)
{ 
   
    ListNode *prev = new ListNode(vec[0]); //prev始终指向标尾指针
    ListNode *prevHead = prev;
    for (int i = 1; i < vec.size(); i++)
    { 
   
        ListNode *next_node = new ListNode(vec[i]);
        prev->next = next_node;
        prev = next_node;
    }
    return prevHead; //prevHead始终指向第一个元素
}
int main()
{ 
   
    vector<int> m = { 
   1, 2, 3, 4, 5};
    ListNode *l = createNodeList(m);
    ListNode *res_l = reverseList(l, NULL);
    for (auto p = res_l; p; p = p->next)
    { 
   
        cout << p->val << " ";
    }
    cout << endl;
    return 0;
}

迭代(iteration):

#include <iostream>
#include <vector>
using namespace std;
struct ListNode
{ 
   
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) { 
   }
};
ListNode *reverseList(ListNode *head)
{ 
   
    ListNode *cur = head, *pre = NULL;
    while (cur)
    { 
   
        ListNode *temp = cur->next;
        cur->next = pre;
        pre = cur;
        cur = temp;
    }
    return pre;
}
ListNode *createNodeList(vector<int> &vec)
{ 
   
    ListNode *prev = new ListNode(vec[0]); //prev始终指向标尾指针
    ListNode *prevHead = prev;
    for (int i = 1; i < vec.size(); i++)
    { 
   
        ListNode *next_node = new ListNode(vec[i]);
        prev->next = next_node;
        prev = next_node;
    }
    return prevHead; //prevHead始终指向第一个元素
}
int main()
{ 
   
    vector<int> m = { 
   1, 2, 3, 4, 5};
    ListNode *l = createNodeList(m);
    ListNode *res_l = reverseList(l);
    for (auto p = res_l; p; p = p->next)
    { 
   
        cout << p->val << " ";
    }
    cout << endl;
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137502.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月1日 下午10:00
下一篇 2022年6月1日 下午10:16


相关推荐

  • Ubuntu安装谷歌_谷歌地球手机专业版

    Ubuntu安装谷歌_谷歌地球手机专业版在Ubuntu18.04中安装谷歌地球GoogleEarthGoogleEarth在Linux系统中(Ubuntu18.04)的安装方法1.安装必备组建2.下载GoogleEarth安装包3.安装GoogleEarth4.开启运行GoogleEarthGoogleEarth在Linux系统中(Ubuntu18.04)的安装方法1.安装必备组建使用gdebi在我们的系统上安装Goo…

    2025年12月11日
    5
  • Git远程仓库(2)

    Git远程仓库(2)

    2021年5月23日
    125
  • webots自学笔记(一)软件界面和简单模型仿真

    webots自学笔记(一)软件界面和简单模型仿真由于毕设研究需要使用webots软件,在学习使用webots的过程花费了很多时间。由于这个软件基本没有什么中文资料,所以想把自己所学到的一些东西写下来,如有什么错误的地方,大家可以批评指正。1.界面

    2022年8月3日
    7
  • 如何让css文字垂直居中(上)

    如何让css文字垂直居中(上)其实可以很容易地实现 CSS 文字的水平居中 但是有时候我们需要将文字垂直居中 除了表格实现这种 CSS 文字的垂直居中之外 还有很多其他的方式注意 下面的 demo 只适用于现代浏览器 不兼容 IE 的低版本和其他非主流浏览器 实现 css 文字垂直居中的 8 种方法如下 1 使用绝对定位和负外边距对块级元素进行垂直居中 css 垂直居中效果 css 垂直居中实现代码 这个方法兼容性不错 但是有一个小缺点 必须提前知道被居中块级元素的尺寸 否则无法准确实现垂直居中 2 使用绝对定位和 transform 代码如下

    2025年7月7日
    2
  • EVE-NG模拟器教程(一)——安装包下载「建议收藏」

    EVE-NG模拟器教程(一)——安装包下载「建议收藏」一、EVE-NG基本简介EVE-NG(EmulatedVirtualEnvironment-NextGeneration)是一款由第三方制作的、功能强大的免费模拟器,是Unetlab(UnifiedNetworkingLab,统一网络实验室)模拟器的最新版本(Unetlab2.0),融合了dynamips,IOL,KVM,可以支持丰富的模拟镜像格式,不仅可以模拟交换机、路由器、防火墙等网络设备,还可以运行任何格式为qcow2的虚拟机。相比传统的模拟器(如GNS3),其最大特色就…

    2022年5月27日
    79
  • 如何获取服务器时间_获取服务器硬件信息

    如何获取服务器时间_获取服务器硬件信息使用Sigar获取服务器信息

    2022年4月20日
    101

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号