问题标题: 酷町堂:递推

0
0
已解决
郑怡翔
郑怡翔
初级天翼
初级天翼

各位大佬们,我还没有学到递推,但我想了解一下子,有谁可以发一下关于递推的文章(自己打的话更可能被采纳)。

谢谢各位大佬们

 

我想做1.10而已,看看能否提前做点基础的


0
已采纳
童梦圆
童梦圆
资深守护
资深守护

一、递推算法基本思想:

     递推算法是一种理性思维模式的代表,其根据已有的数据和关系,逐步推导而得到结果。递推算法的执行过程如下:

     1)根据已有的·结果和关系,求解中间结果

     2)判定是否达到要求,如果没有达到,则继续根据已知结果和关系求解中间结果;如果满足要求,则表示寻找到一个正确的答案。

递推算法往往需要用户知道答案和问题之间的逻辑关系。在许多数学问题中,都有着明确的计算公式可以遵循,因此往往可以采用递推来实现。

2.递推算法示例

     如果一对两个月大的兔子以后每个月可以生一对兔子,而一对新生的兔子出生两个月后才可以生兔子。也就是说1月份出生的3月份才能生子。假定一年内兔子没有死亡事件,那么一年后共有多少对兔子。

    分析产仔问题,逐月分析每月的兔子对数:

    第一个月:1对兔子

   第二个月:1对兔子

   第三个月:2对兔子

   第四个月:3对兔子

   第五个月:5对兔子

   第六个月:8对兔子

  。。。。。。。

可以看出,从第三个月开始,每个月的兔子总队数是前两个月的对数之和,公式如下:

  第n个月兔子总数Fn = F(n-1)+F(n-2)

 代码示例:

    public static int Fibonacci(int n){ //月数
        int t1,t2;
        if(n == 1 || n ==2){
            return 1;
        }else{
            t1 = Fibonacci(n-1);
            t2 = Fibonacci(n-2);
            return t1+t2;
        }

    }

二、递归算法思想:

 递归算法即在程序中不断反复调用自身来达到求解问题的方法。编写递归算法时,必须使用if语句强制方法在未执行递归调用前返回。如果不这样做,在调用方法后,它将永远不会返回。

缺点:递归算法比非递归形式运行速度要慢一些。

算法示例:

  计算阶乘,就是从1到指定数之间的所有自然数相乘的结果,n的阶乘为:

   n! = n*(n-1)*(n-2)*.......*2*1;

   代码:

int fact(int n){
   if(n <= 1)
      return n;
   else
      return n*fact(n-1);  //递归

}

 

0
0
0
邓光宇
邓光宇
修练者
修练者

你好

递归你可以想成一个加工厂,自己调用自己,切记(一定要有出口)

0
邓光宇
邓光宇
修练者
修练者

//一个简单的递归 
#include<iostream>
using namespace std;
int a(int b)
{
    if(b==1)
    return 1;//出口 
    else return a(b-1)+1;//自己调用自己 

int main()
{
    int s;
    cin>>s;
    cout<<a(s);//输出自身 
}

0
张梓沫
张梓沫
资深守护
资深守护

家里有橙色信息学奥赛一本通吗,第130页到第136页

0
傅文彬
傅文彬
新手天翼
新手天翼

基本含义

​是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。

在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。

使用递归解决问题,思路清晰,代码少。但是在主流高级语言中(如C语言、Pascal语言等)使用递归算法要耗用更多的栈空间,所以在堆栈尺寸受限制时(如嵌入式系统或者内核态编程),应避免采用。所有的递归算法都可以改写成与之等价的非递归算法

汉诺塔问题,是常见可用递归解决的问题,不过也有非递归的解法。

菲波纳契数列可用递归定义。

以下为求汉诺塔问题的Pascal程序:

procedure Hanoi(n:integer;x,y,z:char);递归递归

begin

if n<>1 then begin

Hanoi(n-1,x,z,y);

writeln(x,n,z);

Hanoi(n-1,y,x,z);

else writeln(x,n,z);

end;

end;

上述程序用接近自然语言的伪代码可表述如下:

Hanoi 过程 (整型参数n; 字符型参数 x,y,z);

//注:n 代表本步中要处理的盘子数,x,y,z 分别表示 n 号盘子原来所在柱子、经由柱子、目标柱子

开始

如果 n 不为 1 ,那么:开始

调用 Hanoi 过程 (参数为 n-1,x,z,y);

//注:这一步表示用本过程方法将剩余 n-1 个盘子从柱子 x 经由柱子 z 移动到柱子 y

输出 x,n,z; //注:表示将 n 号盘子从 x 移动到 z

调用 Hanoi 过程 (参数为 n-1,y,x,z);

//注:这一步表示用本过程方法将剩余 n-1 个盘子从柱子 y 经由柱子 x 移动到柱子 z

结束; //以上程序段就完成了把 n 个盘子从柱子 x 经由柱子 y 移动到柱子 z

否则 输出 x,n,z; //注:若 n 为1 的话本句直接输出表示将 n 号盘子从 x 移动到 z

结束;

折叠编辑本段递归定义

递归,就是在运行的过程中调用自己。

构成递归需具备的条件:

函数嵌套调用过程示例

1. 子问题须与原始问题为同样的事,且更为简单;

2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。

数学计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。

例如,下列为某人祖先的递归定义:

某人的双亲是他的祖先(基本情况)。某人祖先双亲同样是某人的祖先(递归步骤)。斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21..... I

斐波纳契数列是典型的递归案例:

递归关系就是实体自己和自己建立关系。

Fib(0) = 1 [基本情况] Fib(1) = 1 [基本情况] 对所有n > 1的整数:Fib(n) = (Fib(n-1) + Fib(n-2)) [递归定义] 尽管有许多数学函数均可以递归表示,但在实际应用中,递归定义的高开销往往会让人望而却步。例如:

阶乘(1) = 1 [基本情况] 对所有n > 1的整数:阶乘(n) = (n * 阶乘(n-1)) [递归定义] 一种便于理解的心理模型,是认为递归定义对对象的定义是按照“先前定义的”同类对象来定义的。例如:你怎样才能移动100个箱子?答案:你首先移动一个箱子,并记下它移动到的位置,然后再去解决较小的问题:你怎样才能移动99个箱子?最终,你的问题将变为怎样移动一个箱子,而这时你已经知道该怎么做的。

如此的定义在数学中十分常见。例如,集合论对自然数的正式定义是:1是一个自然数,每个自然数都有一个后继,这一个后继也是自然数。

德罗斯特效应

德罗斯特效应是递归的一种视觉形式。图中女性手持的物体中有一幅她本人手持同一物体的小图片,进而小图片中还有更小的一幅她手持同一物体的图片,依此类推。

又例如,我们在两面相对的镜子之间放一根正在燃烧的蜡烛,我们会从其中一面镜子里看到一根蜡烛,蜡烛后面又有一面镜子,镜子里面又有一根蜡烛……这也是递归的表现。

折叠编辑本段递归应用

递归算法一般用于解决三类问题:

(1)数据的定义是按递归定义的。(Fibonacci函数

(2)问题解法按递归算法实现。

这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。

(3)数据的结构形式是按递归定义的。

如二叉树、广义表等,由于结构本身固有的递归特性,则它们的操作可递归地描述。

递归的缺点:

递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。

递归典型问题: 梵塔问题(汉诺塔问题)

已知有三根针分别用A, B, C表示,在A中从上到下依次放n个从小到大的盘子,现要求把所有的盘子

从A针全部移到B针,移动规则是:可以使用C临时存放盘子,每次只能移动一块盘子,而且每根针上

不能出现大盘压小盘,找出移动次数最小的方案.

0
我要回答