递归和迭代

文章目录
  • 前言
  • 一、递归
  • 二、迭代与递归的关系
    • 1.迭代基本概念
    • 2.迭代基本概念
  • 三、递归迭代计算斐波那契数列

前言
递归之前是很懵的,今天搞了个编程例子,慢慢加深理解吧。

一、递归

编程实例

1.例子1
代码如下(示例):

#include <iostream>
#include <stdlib.h>
#include <stdio.h>

void getDataNum(int data)
{
    int num = 0;
    if (data != 0) {
        num = data % 10;
        data = data / 10;
        printf("%d ", num);
        getDataNum(data);
    }
    return;
}

int main()
{
    int dat = 125;
    getDataNum(dat);
    std::cout << "Hello world!" << std::endl;
    return 0;
}


2024年9月13日15:13:09

上述代码打印结果

// 打印结果 5 1 2 

已经不知道这个代码是哪里来的了,不过应该是从其他地方拷贝过来的。
因为这两天我看了下《C和指针》递归的章节,里面提到了上述代码的例子。
2024年9月13日14:26:42
《C和指针》Page130
里面提到了计算阶乘和斐波那契数列都不是递归的最优解,上述代码例子才是递归的最佳用法。
确实,尤其是计算斐波那契数列非常消耗栈资源。


二、递归与迭代的区别与关系

递归与迭代的关系

1、例子
写一个迭代和递归的例子:

#include <iostream>
#include <stdio.h>

//迭代
int caculateFactorial(int n)
{
    int total = 1;
    while (n) {
        total = total * n;
        n--;
    }
    return total;
}


//递归
int caculateFactorialByRecursion(int n)
{
    int total = 1;
    if (n == 1) {
        return 1;
    } else {
        total = n * caculateFactorialByRecursion(n - 1);
    }
    return total;
}

//error
//int caculateFactorialByRecursion(int n)
//{
//    int total = 1;
//    if (n == 1) {
//        return 1;
//    } else {
//        total = total * caculateFactorialByRecursion(n);
//        n--;
//    }
//
//    return total;
//}

int main()
{
    int data = caculateFactorial(5);
    printf("%d\n", data);
    int dataByRecursion = caculateFactorialByRecursion(5);
    printf("%d\n", dataByRecursion);

    std::cout << "Hello world!" << std::endl;
    return 0;
}

2024年9月13日15:09:24注

今天再看这边的代码,上面的代码打印结果是

120
120
Hello world!

上面的函数名定义好像是在求斐波那契数列,但是实际是在算5的阶乘,算阶乘的话结果正确。这边说明一下。


下面开始看一些知识点:

1、迭代
基本概念

迭代(iteration)是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果。 每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。

利用迭代算法解决问题,需要做好以下三个方面的工作:

确定迭代变量
建立迭代关系式
对迭代过程进行控制

2、递归
基本概念

程序调用自身的编程技巧称为递归( recursion)。递归算法是一种直接或者间接调用自身函数或者方法的算法,它实质上是把一个大型复杂的原问题拆分成具有相同性质的子问题来求解。

递归至少满足以下两个条件:

在过程或函数内调用自身;
必须有一个明确的递归终止条件。
那么计算5!时程序的执行过程如下:

factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
return 1
return 21 = 2
return 3
2 = 6
return 46 = 24
return 5
24 = 120

三、后续

2024年9月13日15:11:52

再次更新这篇文章

之前有段时间还很迷糊递归和迭代的区别,重新看了个书籍和这篇帖子又加深了理解一些。

还需要完善一下,迭代替代递归计算斐波那契数列的代码。代码如下:

// 斐波那契数列 1 1 2 3 5 8 13 21 ...
static uint32_t g_fibonacciCount;           // 计数递归过程中3被计算次数
uint32_t FibonacciWithRecursion(uint32_t dat)
{
    if (dat == 3) {
        g_fibonacciCount++;
    }
    uint32_t num = 0;
    if (dat == 0) {
        return 0;
    }
    if (dat == 1 || dat == 2) {
        return 1;
    }
    num = FibonacciWithRecursion(dat - 1) + FibonacciWithRecursion(dat - 2);
    return num;
}

uint32_t FibonacciWithIteration(uint32_t dat)
{
    uint32_t num = 0;
    uint32_t nowData = 1;
    uint32_t preData = 1;
    if (dat == 0) {
        return 0;
    }
    if (dat == 1 || dat == 2) {
        return 1;
    }
    
    dat -= 2;
    while (dat--) {
        num = nowData + preData;
        preData = nowData;
        nowData = num;
    }
    return num;
}

int main()
{
    printf("FibonacciWithRecursion:%d\n", FibonacciWithRecursion(10));
    printf("g_fibonacciCount:%d\n", g_fibonacciCount);
    printf("FibonacciWithIteration:%d\n", FibonacciWithIteration(10));
    return 0;
}

下面的是斐波那契数列迭代计算逻辑图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值