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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 正态qq图怎么判断分布_怎么判断是不是QQ小号

    正态qq图怎么判断分布_怎么判断是不是QQ小号一、正态QQ图的原理QQ图通过把测试样本数据的分位数与已知分布相比较,从而来检验数据的分布情况。[1]分位数:亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点。常用的有一个分位数叫,百分位数,它是指如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。QQ图是一种散点图,对应于正态分布的QQ图,就是由标准正态分布的分位

    2022年8月10日
    4
  • IntelliJ 2022 激活码【中文破解版】2022.02.08

    (IntelliJ 2022 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html4KDDGND3CI-eyJsaWNlbnNlSW…

    2022年4月1日
    80
  • 用javascript去掉字符串空格的办法

    今天遇到了以关于JavaScript中怎么去掉字符串中前后两段的空格,我只好向就得js中也后Trim()函数,后来试试了不行,就网上找了下解决方法,其中用到了正则表达式,整理了下:12

    2021年12月21日
    41
  • 实用技巧:利用Excel实现客户档案的统一管理「建议收藏」

    实用技巧:利用Excel实现客户档案的统一管理「建议收藏」背景:一个朋友新开了家门市,生意不错,客源旺盛。有次我们喝茶时,他透露一个问题,就是客户的档案管理很不理想,都是纸面的,很容易丢失,也不方便查找。我自诩混迹IT界多年,当然要替好友解决这个小麻烦。考虑到他的门市规模和店员能力,什么ERP、CRM之类的还是免了吧,朋友的要求也很直接,就是俩字:简单。这样的话确实简单了,EXCEL就可以搞定,而且使用门槛相当于零!喝完茶,基本思…

    2025年8月6日
    4
  • kali安装步骤失败 选择并安装软件_kali怎么装arpspoof

    kali安装步骤失败 选择并安装软件_kali怎么装arpspoof1.在我刚刚安装好kali系统后,使用arpspoof命令显示无此命令这时需要安装,于是百度下来的结果:apt-getinstalldsniffssldump2.但是会出现:“E:无法定位软件包问题”于是百度上大佬的解决办法是:更新:source.list文件中是有关Ubuntu软件更新的源服务器的地址,默认为Ubuntu官方地址,为提高速度我们可以修改为其他服务器地址cd/e…

    2022年10月6日
    2
  • java遍历文件夹下所有图片_遍历指定文件夹下的所有图片,并复制到指定目录下…

    java遍历文件夹下所有图片_遍历指定文件夹下的所有图片,并复制到指定目录下…importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importjavax.imageio.ImageIO;publicclassCopy{/***遍历文件夹下的所有图片文件,并复制到指定文件夹…

    2022年6月1日
    78

发表回复

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

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