递推和递归、迭代的关系简介

2023-11-17

递推和递归、迭代的关系简介

在编程里,递推关系可以通过递归或者迭代来实现,但是递归和迭代又不仅仅只能用来实现递推关,有更广泛的用途。

递推、递归和迭代都是解决问题的方法,它们之间有一定的联系。递归和迭代可以用于实现递推关系,但它们也有各自独立的应用场景。

递推:递推是一种通过重复计算较小的相似子问题来解决较大问题的方法。递推的关键思想是将原问题分解为一系列较小的相似子问题,然后通过计算子问题的解来得到原问题的解。递推算法通常使用递归结构来实现。

递归:递归是一种函数调用自身的技术,通过将问题分解成相似的子问题来解决问题。在递归实现中,函数在其定义中调用自身,这样可以通过重复调用函数来解决问题。递归可以用于实现递推关系。

迭代:迭代是一种重复执行某些操作的方法,通过在每个迭代中更新变量来逐步解决问题。迭代可以用于实现递推关系。迭代通常通过循环结构(如 for 循环或 while 循环)实现。

下面是几个简单常见的例子,采用C++、Python使用迭代算法实现。

★斐波那契数列:斐波那契数列指的是这样一个数列:0,1,1,2,3,5,8,13,21,34,55,89...。

这个数列从第3项开始,每一项都等于前两项之和。

斐波那契数列是一种经典的递推问题,它的定义是:f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2)。通过这个递推关系式,可以求解斐波那契数列的第 n 项。

☆C++实现:

#include <iostream>  
using namespace std;  

int main() {  
    int n;  
    cout << "请输入项数 n 的值: ";  
    cin >> n; 
	
	if (n <= 1) {  
        return n;  
    }  
    int f1 = 0, f2 = 1, fn;  
    for (int i = 2; i <= n; i++) {  
        fn = f1 + f2;  
        f1 = f2;  
        f2 = fn;  
    }  
    
    cout << "斐波那契数列的第 " << n << " 项为:" << fn << endl;  
    return 0;  
}

下面改用使用自定义函数实现:

#include <iostream>  
using namespace std;  
  
int fibonacci(int n) {  
    if (n <= 1) {  
        return n;  
    }  
    int f1 = 0, f2 = 1, fn;  
    for (int i = 2; i <= n; i++) {  
        fn = f1 + f2;  
        f1 = f2;  
        f2 = fn;  
    }  
    return fn;  
}  
  
int main() {  
    int n;  
    cout << "请输入项数 n 的值: ";  
    cin >> n;  
    cout << "斐波那契数列的第 " << n << " 项为:" << fibonacci(n) << endl;  
    return 0;  
}

☆Python实现:

n = int(input("请输入 n 的值:"))
if n <= 1:  
    fn = n

f1, f2 = 0, 1 

for i in range(2, n+1):  
    fn = f1 + f2  
    f1, f2 = f2, fn
        
print("斐波那契数列的第 {} 项为:{}".format(n, fn))

下面改用使用自定义函数实现:

def fibonacci(n):  
    if n <= 1:  
        return n
  
    f1, f2 = 0, 1 
 
    for i in range(2, n+1):  
        fn = f1 + f2  
        f1, f2 = f2, fn  
    return fn  

n = int(input("请输入 n 的值:"))  
print("斐波那契数列的第 {} 项为:{}".format(n, fibonacci(n)))

★等差数列求和: 1, 3, 5, 7, 9 是一个公差为 2 的等差数列。等差数列的求和问题可以通过递推算法解决。设等差数列的首项为 a1,公差为 d,第 n 项为 an,则 an=a1+(n-1)d。要求等差数列的前 n 项和,可以递推得到:Sn=a1+a2+...+an=n/2[2a1+(n-1)d]。

☆C++实现:

#include <iostream>  
using namespace std;

int main() {  
    int a1, d, n;  
    cout << "输入第一项、公差和项数:";  
    cin >> a1 >> d >> n;  
    int sum = 0;  
    for (int i = 1; i <= n; i++) {  
        sum += a1 + (i - 1) * d;  
    }  
    cout << "等差数列的前 " << n << " 项和为:" << sum << endl;  
    return 0;  
}

☆Python实现:

a1 = int(input("输入第一项: "))  
d = int(input("输入公差: "))  
n = int(input("输入项数: "))  
sum = 0  
for i in range(1, n+1):  
    sum += a1 + (i - 1) * d
    
print("等差数列的前 {} 项和为:{}".format(n,sum))

★等比数列求和:1, 2, 4, 8, 16 是一个公比为 2 的等比数列。等比数列的求和问题也可以通过递推算法解决。设等比数列的首项为 a1,公比为 r,第 n 项为 an,则 an=a1r^(n-1)。要求等比数列的前 n 项和,可以递推得到:Sn=a1(1-r^n)/(1-r)。

☆C++实现:

#include <iostream>
#include <cmath> // 引入 pow()
using namespace std;

int main() {    
    double a1, r, n;    
    cout << "输入第一项、公比和项数:";    
    cin >> a1 >> r >> n;    
    double sum = 0;    
    for (int i = 1; i <= n; i++) {    
        sum += a1 * pow(r, i - 1);    
    }    
    cout << "等比数列的前 " << n << " 项和为:" << sum << endl;    
    return 0;    
}

☆Python实现:

a1 = float(input("输入第一项:"))  
r = float(input("输入公比:"))  
n = int(input("输入项数:"))  
  
sum = 0  
for i in range(1, n + 1):  
    sum += a1 * (r ** (i - 1))  
  
print("等比数列的前 {} 项和为:{}".format(n, sum))

、关于递推、递归和迭代更多情况可参见

递推、迭代、递归https://zhuanlan.zhihu.com/p/501040923

递归和迭代介绍及常见示例(C++、Python实现)https://blog.csdn.net/cnds123/article/details/132409886

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递推和递归、迭代的关系简介 的相关文章

随机推荐

  • Muduo库源码剖析(十)——总结

    Muduo网络库的核心代码模块 Channel 封装fd的对应事件变化情况 和关注事件 fd events revents callbacks 两种channel listenfd acceptorChannel connfd connec
  • 和平精英体验服显示服务器未影响,《和平精英》体验服申请条件是什么?一定要注意这两点!...

    和平精英 体验服是很多玩家了解游戏新版本内容的一个重要窗口 很多新玩法和新地图都会现在体验服中上线测试以后才会在正式服务器中上线 不过很多玩家对于如何才能进入体验服游戏 还根本一无所知 那这次小编就来和大家好好聊聊这个问题 如果感兴趣的话
  • VS报错E1696 无法打开类似于stdio.h等头文件的解决办法

    VS报错E1696 无法打开类似于stdio h等头文件的解决办法 我的VS版本是2022的 然后我今天把同事在VS2017上的code 一个完整的解决方案 从svn上拿过来 结果发现 一大堆E1696的错误 主要表现就是项目中includ
  • Working mode of block password

    本文授权自 MagicBoy Working mode of block password Network security 1 电子密码本ECB electronic codebook mode 3 密码反馈CFB cipher feed
  • Weex实现富文本展示

    Weex默认不支持富文本展示 需要我们手动实现 已知的方式有两种 第一种方式 使用Weex Ui中的wxc rich text组件 它提供了丰富的功能样式 但是其局限性也是显而易见的 不能直接识别h5样式 第二种方式 第一步 自定义组件 请
  • 幼儿园html网页代码,html幼儿园网站页面div+css

    实例简介 幼儿园网站全站代码 使用div css技术 可参考下载 实例截图 核心代码 schoolyr schoolyr baojian html css alixixi css baojian css css css jiaoxue cs
  • python 注解, 装饰器@ 详解

    目录 1 组合数据类型注解方式 2 自定义类注解 3 参数是函数的注解 4 变量注解 5 装饰器 python注解包含 组合数据类型注解 自定义类注解 变量注解 参数是函数的注解等 python的注解 能够让python 像java C语言
  • qt creator debug无法调试 进入 qt源码

    qt creator无法调试qt源码的问题 如果自己写的代码无法调试请移步这里 qt下载地址 https download qt io archive qt https download qt io new archive qt 正常来讲
  • .net 5 开发 linux 桌面应用_Electron跨平台桌面应用开发工具

    一 简介 Electron是github发布的跨平台桌面应用开发工具 支持Web技术开发桌面应用 其本身是基于C 开发的 GUI核心来自于Chrome 而JavaScript引擎使用v8 简单来说 Electron相当于一个浏览器的外壳 可
  • Jupyter-02-numpy:创建ndarray 数组

    创建ndarray 数组的方法 import numpy as np 创建ndarray 数组需要调用numpy库 用列表创建 创建一维数组 arr1 np array 1 2 3 4 arr1 s a b c np array s 用元组
  • Scala中的元祖Tuple

    Scala中元祖是一组任意数据类型的集合 与列表一样 元组也是不可变的 但与列表不同的是元组可以包含不同类型的元素 数组 元祖 定义 元素中数据类型相同 元素不同数据类型 声明 val arr Array 1 2 3 var tuple 1
  • 华为服务器系统故障,服务器系统故障

    服务器系统故障 内容精选 换一换 需在所有云服务器上安装Data Provider软件 SAP技术支持人员通过该软件收集云服务器所在的平台信息 以便在SAP系统故障 性能下降时进行定位和分析 SAP NetWeaver所在的服务器上 在创建
  • 导致java.lang.UnsatisfiedLinkError错误的一种解决办法

    欢迎转载请注明出处http blog csdn net ning gg article details 53641254 在程序中加入so文件导致java lang UnsatisfiedLinkError错误的一种解决办法 可能这个解决办
  • 学Java需要的英语水平以及关键词汇总

    还是需要英语的 但是是编程英语 和从小到大学的 英语 不是一回事 Java语言的输出语句 System out print 你好 此处的 System表示 系统 out表示 在 外面 print表示 打印 每一个单词之间使用 英文输入法的点
  • streamlit——搭建学生评分网站(告别问卷星)

    streamlit搭建多人评分网站 文章目录 streamlit搭建多人评分网站 一 引言 二 数据准备 三 streamlit代码 四 数据合并代码 一 引言 当需要对班级内多人进行打分时 为了不使用问卷星等平台进行评分 使用pandas
  • AJAX核心基础知识之倒计时抢购案例

    倒计时 分析 两个时间 目标时间 当前时间 目标时间 当前时间 计算时间差中包含多少小时 多少分钟 多少秒 每间隔一秒钟重新获取当前时间 定时器 重算时间 核心问题 1当前时间不可以获取客户端本地的 本地的时间客户可以肆意修改 获取服务器的
  • 遗传算法理解(通俗易懂)

    最近研究模糊识别的一些经典算法 为更好地理解遗传算法的运算过程 下面用手工计算来简单地模拟遗传算法的各个主要执行步骤 例 求下述二元函数的最大值 1 个体编码 遗传算法的运算对象是表示个体的符号串 所以必须把变量 x1 x2 编码为一种 符
  • Gitee问题解决1:Gitee如何下载历史提交版本

    1 把在线的git历史版本代码下载到本地 打开gitee某个项目的主页 点击统计 点击提交 能够看到自己历史的提交信息 选择需要下载版本出的浏览文件 通过左上方黄色框能够看到提交版本的id 之后点击克隆 下载 点击下载ZIP即可 解压 2
  • mysql中sql语句使日期增加一年

    mysql表中有一些字段是显示日期的 因为各种需要 需要将它时间往后调整1年 mysql 日期增加一年的更新语句更新的语句如下 UPDATE table SET date DATE ADD date INTERVAL 1 YEAR 如果要增
  • 递推和递归、迭代的关系简介

    递推和递归 迭代的关系简介 在编程里 递推关系可以通过递归或者迭代来实现 但是递归和迭代又不仅仅只能用来实现递推关 有更广泛的用途 递推 递归和迭代都是解决问题的方法 它们之间有一定的联系 递归和迭代可以用于实现递推关系 但它们也有各自独立