递推与递归

本文介绍了递推和递归的概念及其应用。递推通过初始值和递推关系式求解问题,例如自然数立方的奇数和。递归则是函数调用自身解决问题的方式,例如递归求和与计算阶乘。文中还探讨了函数调用的堆栈原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递推与递归

各位码农们大家好啊!好久不见!这一篇博客,小编将带领大家学习递推与递归。
P.S. 本博客属于自创类型,请不要擅自抄袭。代码公开,供大家学习。

递推算法以初始{起点}值为基础,用相同的运算规律,逐次重复运算,直至运算结束。这种从“起点”重复相同的方法直至到达一定“边界”,犹如单向运动,用循环可以实现。递推的本质是按规律逐次推出(计算)下一步的结果。
步骤:分析问题,找出递推关系式,注意边界条件(初始值),如菲波拉契数列:

an=an-1+an-2;   (n>=3)
a0=1,a1=1;      (初始条件)

【例1】、任何一个自然数的立方都可以写成一串连续奇数之和。如:
    13=1
23=3+5=8
33=7+9+11=27
43=13+15+17+19=64
……………………….
编程输入N,求N3是由哪些奇数之和。
观察后我们很容易得出结论,n的3次方应该由n个连续的奇数之和构成,所以只要求出第一个数便可。由数学知识可知,第一项为:n*n-(n-1)。
an=an-1+2; n>=2
* 此处代码省略,本题供大家学习编写。若想要源代码,@我的QQ:1711411367,也欢迎大家加小编的QQ讨论哦!*

【例2】、骨牌铺法:
有1×n的一个长方形,用一个1×1、1×2和1×3的骨牌铺满方格。例如当n=3时为1×3的方格。此时用1×1、1×2和1×3的骨牌铺满方格,共有四种铺法。如下图:

递推关系式为:
an=an-1+an-2+an-3; n>=4;
a1=1,a2=2,a3=4; (初始条件)
(小编附上源代码)

#include<cstdio>
int main()
{  
    long long a[55]={0};  
    int n=1,i; 
    a[1]=1;  
    a[2]=2;  
    a[3]=3;  
    for(i=4;i<=51;i++){  
        a[i]=a[i-1]+a[i-2];  
    }  
    while(scanf("%d",&n)!=EOF)
    {  
        printf("%lld\n",a[n]);  
    }  
    return 0;  
}  

二、 递归:
当函数的定义中,其内部操作又直接或间接地出现对自身的调用,则称这样的程序嵌套定义为递归定义。
递归通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只 需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。
例如,在数学上,所有偶数的集合可递归地定义为:
  ①0是一个偶数;
  ②一个偶数与2的和是一个偶数。
可见,仅需两句话就能定义一个由无穷多个元素组成的集合。在程序中,递归是通过函数的调用来实现的。函数直接调用其自身,称为直接递归;函数间接调用其自身,称为间接递归。
我们来一起看一道例题。

【例1】、用递归的方法求1+2+3+……+N的值。
分析:我们来简要的看一看这一道题。首先,我们考虑边界条件,当值为:1的时候,我们的递归函数直接返回1(return 1),其他的条件我们可以列递归式:x+sum(x-1)。
下面,小编附上源代码。

#include<iostream>
using namespace std;
int sum(int);
int main()
{
    int n;
    scanf("%d",&n);
    printf("%d",sum(n));
    return 0;
}
int sum(int x)
{
    if (x==1) return 1;   //递归边界
    else return x+sum(x-1);
}

【例2】、用递归来计算阶乘。
相信这一道题目大家都并不陌生,小编也就不再多说,直接附上递归函数(主程序就……)

int f(int n)
{
    return n=0?1:f(n-1)*n;
}

很多同学可能有些不是很理解,我们下面来简单讨论下关于函数调用的概念:
堆 (heap。软件底层原理,而非数据结构)
堆位于RAM中,是一个通用的内存池,它一般由程序员分配释放。
栈 (hardware stack。软件底层原理,而非数据结构)
栈存在于RAM中,它由编译器自动分配、释放。栈是动态的。
帧栈(stack frame):在内存的程序栈中,为单个过程(函数)分配的那部分栈称为帧栈。栈用来传递过程参数、存储返回信息、保存寄存器以供以后恢复之用,以及 用于本地存储。
调用栈(call stack):描叙函数间的调用关系,它由多个栈桢(Stack Frame)组成。每个栈桢对应一个未运行完成的函数,里面保存着返回地址和局部变量。所以在函数每次递归调用都会生成新的帧栈,和普通函数间的调用效果一样。每次函数执行完毕就会删除帧栈,处理返回值和回到上次调用的地址。
另外,调用栈所在的段称为堆栈段,有自己的大小,不能越界访问,造成栈溢出。(10万级,和数组也有关系,约4m)

好啦,今天小编也就说到这里啦,大家有什么不懂的地方,欢迎大家通过QQ私戳小编(1711411367),本人也属学生党一枚,不能随时回答大家的问题。好啦,我们下期再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值