文章目录
- 前言
- 一、递归
- 二、迭代与递归的关系
- 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 32 = 6
return 46 = 24
return 524 = 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;
}
下面的是斐波那契数列迭代计算逻辑图