探索吧 > 百科 > 正确递归的方法

正确递归的方法

导读递归方法的定义答1、定义是递归的:(1)n!的递归实现:递归方法:public class Method {    int fun(int n){    if(n==1)        return 1;    elsereturn(fun(n-1)*n);}}pu...

今天探索吧就给我们广大朋友来聊聊方法递归是指,以下关于观点希望能帮助到您找到想要的答案。

递归方法的定义

递归方法的定义

1、定义是递归的:

(1)n!的递归实现:

递归方法:

public class Method {    int fun(int n){    if(n==1)        return 1;    else

return(fun(n-1)*n);

}

}

public class RecursionDemo {    public static void main (String[] args){

Method m=new Method();      int num=m.fun(3);

System.out.println(num);

}

}

递归方法分析:

(1)该方法是直接递归,即自己调用自己。

例如:在执行fun(3)的时候,先执行fun(2)*3,而fun(2)=fun(1)*2,fun(1)=1。

(2)递归过程将问题的规模逐步缩小,参数的大小每次减1。一个个重复的过程,通过调用自身,减少了代码量。

(3)因为递归调用语句是在最后一句,因此,这种递归方式也称为尾递归。

2、数据结构是递归的:

     单链表的存储结构定义。

3、问题的求解是递归的:

#include<stdio.h> #include<malloc.h> #include<stdlib.h>#define LIST_INIT_SIZE 100

#define LISTINCREMENT 10#define OVERFLOW -2#define ERROR 0

#define OK 1typedef int ElemType;

typedef struct{ //存储结构 ElemType *elem; //指针类型 int length;

int listsize;

}SqList;//顺序表的结构类型 typedef int Status;

Status InitList(SqList &L){        

L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//动态分配存储空间 if(!L.elem) exit(OVERFLOW);  //分配失败退出 L.length=0;                  //空表 L.listsize=LIST_INIT_SIZE; //初始存储容量 return OK;

}

Status ListInsert(SqList &L,int i,ElemType e){//在第 i 个元素前插入一个新的元素e if(i<1 || i > L.length+1) return ERROR; //i值不合法 if(L.length>=L.listsize) //存储空间不足 {

ElemType * newbase=(ElemType *)realloc(L.elem,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(ElemType));

if(!newbase) exit(OVERFLOW); //分配失败 L.elem=newbase;

L.listsize=LIST_INIT_SIZE+LISTINCREMENT;

}

for (int j=L.length; j>=i; --j)

L.elem[j]=L.elem[j-1];

L.elem[i-1]=e;

L.length++;return OK;

}

Status ListEmpty(SqList L){ //判断顺序表是否为空return L.length == 0;

}

Status ListPrint(SqList &L) {

printf(" 顺序表为: ");

if (ListEmpty(L)) {

printf(" 空。 n");

return ERROR;

}

for (int i=0; i<L.length; ++i)

{

printf("%-4d ", L.elem[i]);

}

printf("n");

return OK;

}int Sum(SqList L,int i){    if(i==L.length)    return 0;    else

return(L.elem[i]+Sum(L,i+1));

}

main(){

SqList L;

ElemType e;

int i,j;

InitList(L);

printf(" 请输入你想创建的顺序表中元素的个数: ");

scanf("%d",&i);

if(i<1) printf(" 您输入的值有误,无法创建顺序表。 n");

else {

printf(" 请您依次输入您想创建的顺序表的元素: ");

for(j=1;j<=i;j++)

{

scanf("%d",&e);

ListInsert(L,L.length+1,e); //尾插 }

}

ListPrint(L); //遍历顺序表 int result=Sum(L,0);

printf( "顺序表所有元素的和为:%d",result);

}

这个程序是求解顺序表的元素的和,从顺序表的第一个元素开始,依次向后查找元素,并进行求和运算。

java中递归算法是什么怎么算的?

一、递归算法基本思路:

Java递归算法是基于Java语言实现的递归算法。递归算法是一种直接或者间接调用自身函数或者方法的算法。递归算法实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法表示问题的解。递归往往能给我们带来非常简洁非常直观的代码形式,从而使我们的编码大大简化,然而递归的思维确实跟我们的常规思维相逆的,通常都是从上而下的思维问题,而递归趋势从下往上的进行思维。

二、递归算法解决问题的特点:

【1】递归就是方法里调用自身。

【2】在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

【3】递归算法代码显得很简洁,但递归算法解题的运行效率较低。所以不提倡用递归设计程序。

【4】在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。

【5】在做递归算法的时候,一定把握出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。其实这个出口就是一个条件,当满足了这个条件的时候我们就不再递归了。

三、代码示例:

public class Factorial {

    //this is a recursive function

    int fact(int n){

        if (n==1) return 1;

        return fact(n-1)*n;

    }

     

}

     public class TestFactorial {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        Factorial factorial=new Factorial();

        System.out.println("factorial(5)="+factorial.fact(5));

    }

}

代码执行流程图如下:

此程序中n=5就是程序的出口。

java中的递归方法是怎么样的?请举例解析一下

public int sum(int number){

if(number == 1){

return 1;

}else{

return number+ sum(number-1);

}

}

---------------------------------------

这个就是最简单的递归调用求和:以此类推既可以。

例如:

sum(4);

4 + sum(3);

-----3 + sum(2)

----------2 + sum(1);

---------------1;

什么是递归函数? 怎样实现递归?

递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。

当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件。

所以递归要有两个要素,结束条件与递推关系。

递归有两个基本要素:

(1)边界条件:确定递归到何时终止,也称为递归出口。

(2)递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果

在递归函数中,调用函数和被调用函数是同一个函数,需要注意的是递归函数的调用层次,如果把调用递归函数的主函数称为第0层,进入函数后,首次递归调用自身称为第1层调用;从第i层递归调用自身称为第i+1层。反之,退出第i+1层调用应该返回第i层。

一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。为了保证递归函数的正确执行,系统需设立一个工作栈。具体地说,递归调用的内部执行过程如下:

(1)运动开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址;

(2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈;

(3)每次递归调用结束后,将栈顶元

扩展资料:

递归就是某个函数直接或间接地调用了自身,这种调用方式叫做递归调用。说白了,还是函数调用。既然是函数调用,那么就有一个雷打不动的原则:所有被调用的函数都将创建一个副本,各自为调用者服务,而不受其他函数的影响。

你的ff函数,递归多少次,就有多少个副本,再利用内存的栈式管理,反向退出。这个最好找一下“栈”这方面的东西看看,挺容易的,就像子弹匣一样,先进后出。

从某种意义上说,这是不对的,因为就像刚才说的,一旦被调用,他将在内存中复制出一份代码,再被调用就再复制一份,换句话说,你可以吧同一个函数的多次调用理解称谓多个不同函数的一次调用,这样也会会简单些。

再说=1和=0是为什么退出。递归,很需要注意的就是死递归,也就是说,某一个函数进入了无限调用自身的情况,永无止境地消耗内存等资源,这在编程方面是一大忌。

但凡是递归的函数,一定会在某一个地方存在能够返回上一层函数的代码,否则必定死递归。ff函数中,那个else就是返回的出口,你可以这样想,如果没有那个if来进行判断,你递归到什么时候算完?ff是不是会一直调用自己。

因为一旦某个函数A中调用了函数B(或者自己),那么A中的代码会停在调用的位置,而转向B中去执行,同理,如果B又调用函数C,那么B又停在调用的位置,去执行C,如果无限调用,那么程序是永远不会结束的。

当然,也有这种情况,A调用B,然后继续自己的代码,不管B的死活,这种不在我们的讨论范围内,因为那牵扯到另一种编程方式:多线程。

参考资料:百度百科——递归函数

人天天都会学到一点东西,往往所学到的是发现昨日学到的是错的。从上文的内容,我们可以清楚地了解到方法递归是指。如需更深入了解,可以看看探索吧的其他内容。

本文来自网络,不代表本站立场,转载请注明出处:https://www.tsc-b.com/baike/120205.html

作者: 探索吧

探索吧为您提供最全面的生活百科网站大全,主要为您提供数码、汽车、财经、美食、财经、科技、健康、教育、创业、电商、影视、百科等资讯信息,在这里可以找到您所需的答案,解决您所困惑的问题。
球形喷口套什么定额
5角兑换方法。5角硬币兑换多少人民币
联系我们

联系我们

0898-88881688

在线咨询: QQ交谈

邮箱: email@wangzhan.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部