精华内容
下载资源
问答
  • 关于递归函数描述不正确的是
    2021-05-21 03:19:41

    匿名用户

    1级

    2010-12-11 回答

    递归(recursion)就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。

    递归通常用来解决结构自相似的问题。所谓结构自相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。具体地,整个问题的解决,可以分为两部分:第一部分是一些特殊情况,有直接的解法;第二部分与原问题相似,但比原问题的规模小。实际上,递归是把一个不能或不好解决的大问题转化为一个或几个小问题,再把这些小问题进一步分解成更小的问题,直至每个小问题都可以直接解决。因此,递归有两个基本要素:

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

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

    汉诺塔问题:对汉诺塔问题的求解,可以通过以下3个步骤实现:

    (1)将塔上的n-1个碟子借助塔C先移到塔B上;

    (2)把塔A上剩下的一个碟子移到塔C上;

    (3)将n-1个碟子从塔B借助塔A移到塔C上。

    在递归函数中,调用函数和被调用函数是同一个函数,需要注意的是递归函数的调用层次,如果把调用递归函数的主函数称为第0层,进入函数后,首次递归调用自身称为第1层调用;从第i层递归调用自身称为第i+1层。反之,退出第i+1层调用应该返回第i层。采用图示方法描述递归函数的运行轨迹,从中可较直观地了解到各调用层次及其执行情况,具体方法如下:

    (1)写出函数当前调用层执行的各语句,并用有向弧表示语句的执行次序;

    (2)对函数的每个递归调用,写出对应的函数调用,从调用处画一条有向弧指向被调用函数入口,表示调用路线,从被调用函数末尾处画一条有向弧指向调用语句的下面,表示返回路线;

    (3)在返回路线上标出本层调用所得的函数值。n=3时汉诺塔算法的运行轨迹如下图所示,有向弧上的数字表示递归调用和返回的执行顺序

    三、递归函数的内部执行过程

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

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

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

    (3)每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。

    上述汉诺塔算法执行过程中,工作栈的变化如下图所示,其中栈元素的结构为(返回地址,n值,A值,B值,C值),返回地址对应算法中语句的行号,分图的序号对应图中递归调用和返回的序号

    我可以帮助你,你先设置我最佳答案后,我百度Hii教你。

    更多相关内容
  • 关于递归函数的认识叙述 1.当递归函数中,只有一种递归时(一种递归即指一个因式),比较容易理解,比如计算N!(N的阶乘) 在数学计算中应该是N!=1234…N;而在计算机c语言中应该表示为 void function(int n)...

    关于递归函数的认识叙述

    1.当递归函数中,只有一种递归时(一种递归即指一个因式),比较容易理解,比如计算N!(N的阶乘)
    在数学计算中应该是N!=123*4…*N;而在计算机c语言中应该表示为

    void function(int n)(子函数)
    {
    	if(n==1)
    		return 1;
    	else 
            return n*function(n-1);
    }
    

    /计算的详细过程应该是:
    当N=5时 就是5
    (function(5-1));
    54(function(4-1));
    543*(function(3-1));
    5432(function(2-1));而此时function(1)==1,即返回function(1)=1,得到 5 * 432*1,即得结果。
    2.当递归函数中,不止一种递归时,比如合并排序的使用

    #include<stdio.h>
    #define N 100
    int merge(int *a, int left,int mid,int right)
    {
    	int i,j,k=0;
    	int b[N]={0};
    	i=left;
    	j=mid+1;
    	while(i<=mid&&j<=right) /*把两个序列中小的部分先输入到中间数组*/
    	{
    		if(a[i]<a[j])
    		 	b[k++]=a[i++];
    		else
    		 	b[k++]=a[j++];
    	}
    	while(i<=mid) /*没有输完的序列剩下的依次输入到中间数组*/
    		b[k++]=a[i++];
    	while(j<=right)
    		b[k++]=a[j++];
    	for(i=0;i<k;i++) /*将排序好的出处在中间数组里的序列输入到a数组*/
    		a[left++]=b[i];
    	return 0;
    }
    int mergesort(int *a,int left,int right) /*将序列划分为等大的两部分再调用排序*/
    {
    	int i,j,mid;
    	if(right-left>=1)
    	{
    		mid=(left+right)/2;
    		mergesort(a,left,mid);
    		mergesort(a,mid+1,right);
    		merge(a,left,mid,right); /*调用排序*/
    	}
    	return 0;
    }
    int main()
    {
    	int a[N]={0},i,n;
    	printf("please input the length of the list:\n");
    	scanf("%d",&n);
    	printf("please input the number of the list:\n");
    	for(i=0;i<n;i++)
    		scanf("%d",&a[i]);
    	mergesort(a,0,n-1);
    	printf("the sort of the list is :\n");
    	for(i=0;i<n;i++)
    		printf("%d ",a[i]);
    	printf("\n");
    	return 0;
    }(此代码转载于一位CSDN博主,仅用于借鉴)
    

    在分的过程中,针对于这三个调用

      mergesort(a,left,mid);//1
      mergesort(a,mid+1,right);//2
      merge(a,left,mid,right); //3
    

    应该是先完成第一个的调用,直到第一个left=mid时,再进行第二个的调用,也当满足left=mid时,再进行第三个的调用(第三个是合并排序)。

    展开全文
  • 递归函数正确思维方法

    万次阅读 多人点赞 2018-02-01 20:40:59
    简单的定义: “当函数直接或者间接调用自己时,则发生了递归.” 说起来简单, 但是理解起来复杂, 因为递归直观, 也符合我们的思维习惯, 相对于递归, 我们更加容易理解迭代. 因为我们日常生活中的思维方式就是...


    什么是递归

    简单的定义: “当函数直接或者间接调用自己时,则发生了递归.” 说起来简单, 但是理解起来复杂, 因为递归并不直观, 也不符合我们的思维习惯, 相对于递归, 我们更加容易理解迭代. 因为我们日常生活中的思维方式就是一步接一步的, 并且能够理解一件事情做了N遍这个概念. 而我们日常生活中几乎不会有递归思维的出现.
    举个简单的例子, 即在C/C++中计算一个字符串的长度. 下面是传统的方式, 我们一般都这样通过迭代来计算长度, 也很好理解.

    size_t length(const char *str) {
      size_t length = 0;
      while (*str != 0) {
        ++length;
        ++str;
      }
    
      return length;
    }
    

    而事实上, 我们也可以通过递归来完成这样的任务.

    size_t length(const char *str) {
      if (*str == 0) {
        return 0;
      }
      return length(++str) + 1;
    }
    

    只不过, 我们都不这么做罢了, 虽然这样的实现有的时候可能代码更短, 但是很明显, 从思维上来说更加难以理解一些. 当然, 我是说假如你不是习惯于函数式语言的话. 这个例子相对简单, 稍微看一下还是能明白吧.
    迭代的算法可以这样描述: 从第一个字符开始判断字符串的每一个字符, 当该字符不为0的时候, 该字符串的长度加一.
    递归的算法可以这样描述: 当前字符串的长度等于当前字符串除了首字符后, 剩下的字符串长度+1.
    作为这么简单的例子, 两种算法其实大同小异, 虽然我们习惯迭代, 但是, 也能看到, 递归的算法无论是从描述上还是实际实现上, 并不比迭代要麻烦.

    理解递归

    在初学递归的时候, 看到一个递归实现, 我们总是难免陷入不停的回溯验证之中, 因为回溯就像反过来思考迭代, 这是我们习惯的思维方式, 但是实际上递归不需要这样来验证. 比如, 另外一个常见的例子是阶乘的计算. 阶乘的定义: “一个正整数的阶乘(英语:factorial)是所有小于或等于该数的正整数的积,并且0的阶乘为1。” 以下是Ruby的实现:

    def factorial(n) 
      if n <= 1 then
        return 1
      else
        return n * factorial(n - 1)
      end
    end
    

    我们怎么判断这个阶乘的递归计算是否是正确的呢? 先别说测试, 我说我们读代码的时候怎么判断呢?
    回溯的思考方式是这么验证的, 比如当n = 4时, 那么factoria(4)等于4 * factoria(3), 而factoria(3)等于3 * factoria(2)factoria(2)等于2 * factoria(1), 等于2 * 1, 所以factoria(4)等于4 * 3 * 2 * 1. 这个结果正好等于阶乘4的迭代定义.
    用回溯的方式思考虽然可以验证当n = 某个较小数值是否正确, 但是其实无益于理解.
    Paul Graham提到一种方法, 给我很大启发, 该方法如下:

    1. 当n=0, 1的时候, 结果正确.
    2. 假设函数对于n是正确的, 函数对n+1结果也正确.
      如果这两点是成立的,我们知道这个函数对于所有可能的n都是正确的。

    这种方法很像数学归纳法, 也是递归正确的思考方式, 事实上, 阶乘的递归表达方式就是1!=1,n!=(n-1)!×n(见wiki). 当程序实现符合算法描述的时候, 程序自然对了, 假如还不对, 那是算法本身错了…… 相对来说, n,n+1的情况为通用情况, 虽然比较复杂, 但是还能理解, 最重要的, 也是最容易被新手忽略的问题在于第1点, 也就是基本用例(base case)要对. 比如, 上例中, 我们去掉if n <= 1的判断后, 代码会进入死循环, 永远不会结束.

    使用递归

    既然递归比迭代要难以理解, 为啥我们还需要递归呢? 从上面的例子来看, 自然意义不大, 但是很多东西的确用递归思维会更加简单……
    经典的例子就是斐波那契数列, 在数学上, 斐波那契数列就是用递归来定义的:

    ·F0 = 0
    ·F1 = 1 
    ·Fn = Fn – 1 + Fn – 2

    有了递归的算法, 用程序实现实在再简单不过了:

    def fibonacci(n)
      if n == 0 then
        return 0
      elsif n == 1 then
        return 1
      else
        return fibonacci(n - 1) + fibonacci(n - 2)
      end
    end
    

    改为用迭代实现呢? 你可以试试.
    上面讲了怎么理解递归是正确的, 同时可以看到在有递归算法描述后, 其实程序很容易写, 那么最关键的问题就是, 我们怎么找到一个问题的递归算法呢?
    Paul Graham提到, 你只需要做两件事情:

    1. 你必须要示范如何解决问题的一般情况, 通过将问题切分成有限小并更小的子问题.
    2. 你必须要示范如何通过有限的步骤, 来解决最小的问题(基本用例).
      如果这两件事完成了, 那问题就解决了. 因为递归每次都将问题变得更小, 而一个有限的问题终究会被解决的, 而最小的问题仅需几个有限的步骤就能解决.

    这个过程还是数学归纳法的方法, 只不过和上面提到的一个是验证, 一个是证明.
    现在我们用这个方法来寻找汉诺塔这个游戏的解决方法.(这其实是数学家发明的游戏)

    有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:
    1.每次只能移动一个圆盘.
    2.大盘不能叠在小盘上面.

    汉诺塔

    这个游戏在只有3个盘的时候玩起来较为简单, 盘越多, 就越难, 玩进去后, 你就会进入一种不停的通过回溯来推导下一步该干什么的状态, 这是比较难的. 我记得第一次碰到这个游戏好像是在大航海时代某一代游戏里面, 当时就觉得挺有意思的. 推荐大家都实际的玩一下这个游戏, 试试你脑袋能想清楚几个盘的情况.
    现在我们来应用Paul Graham的方法思考这个游戏.

    一般情况:
    当有N个圆盘在A上, 我们已经找到办法将其移到C杠上了, 我们怎么移动N+1个圆盘到C杠上呢? 很简单, 我们首先用将N个圆盘移动到C上的方法将N个圆盘都移动到B上, 然后再把第N+1个圆盘(最后一个)移动到C上, 再用同样的方法将在B杠上的N个圆盘移动到C上. 问题解决.

    基本用例:
    当有1个圆盘在A上, 我们直接把圆盘移动到C上即可.

    算法描述大概就是上面这样了, 其实也可以看作思维的过程, 相对来说还是比较自然的. 下面是Ruby解:

    def hanoi(n, from, to, other)
      if n == 1 then
        puts from + ' -> ' + to
      else
        hanoi(n-1, from, other, to)
        hanoi(1, from, to, other)
        hanoi(n-1, other, to, from)
      end
    end
    

    当n=3时的输出:

    A -> C
    A -> B
    C -> B
    A -> C
    B -> A
    B -> C
    A -> C

    上述代码中, from, to, other的作用其实也就是提供一个杆子的替代符, 在n=1时, 其实也就相当于直接移动. 看起来这么复杂的问题, 其实用递归这么容易, 没有想到吧. 要是想用迭代来解决这个问题呢? 还是你自己试试吧, 你试的越多, 就能越体会到递归的好处.

    递归的问题

    当然, 这个世界上没有啥时万能的, 递归也不例外, 首先递归并不一定适用所有情况, 很多情况用迭代远远比用递归好了解, 其次, 相对来说, 递归的效率往往要低于迭代的实现, 同时, 内存好用也会更大, 虽然这个时候可以用 尾递归 来优化, 但是尾递归并不是一定能简单做到.

    展开全文
  • 关于递归定义的函数

    2021-05-22 06:50:53
    你是指“递归函数”? 例如分享n。的递归函数。 fun(n) { if(n==0)return 1; return n*fun(n-1); }其实我好想听你说实话,你却总是为了让我难过说谎话关于oracle递归调用的自定义函数如何结束我爱你时,你说什么...

    C语言中函数可以递归定义吗

    什么意思?你是指“递归函数”? 例如分享n。的递归函数。 fun(n) { if(n==0)return 1; return n*fun(n-1); }其实我好想听你说实话,你却总是为了不让我难过说谎话

    关于oracle递归调用的自定义函数如何结束我爱你时,你说什么就是什么。我不爱你,你说你是什么。

    比如存储过程a中有b,b中含a。用return结束判断,执行还是锁表,怎么解决为了撑起自己的梦想,即使身心俱疲还是得咬牙坚持。谁都想过得舒适安逸,但谁不是为了想守护的人而硬撑着努力天才只意味着终身不懈的努力。

    关于oracle递归调用的自定义函数如何结束 可以调用。 C语言最基本的模块为函数,任意函数都可以调用其它任意一个函数,包括函数本身。 其实,很久之前,你就在我的世界里消失了。没有你的消息,我也不会去主动打探。看不见你的模样,也不会故意遇见。知道你又恋爱了,我满心祝福。你看,你就不知不觉地走出了我心底,就如同当初你悄无声息的来,在我还懵懂的时候,你出现,又离开。我已经长大了,长大到没有你,我可以很勇敢的活着。事实证明,我不是没有你不行,我也没有想象中那样喜欢你。我只是喜欢那样倔强坚强的自己。

    自定义函数调用其它自定义函数的例子:#include 快乐像涟漪一样在心中轻轻荡漾,开怀大笑,喜地欢天,嬉皮笑脸。

    怎么记录递归函数的使用次数。就是在做搜索问题时,会遇到的分享短路径问题,广度搜索中可以使用递归的全局变量麻烦,用静态变量好,就是static Int count=0;然后在递归函数中加条语句count++;最后在递归外输出count就ok了。

    以下对C语言函数的有关描述中,不正确的描述是冷雨纷纷,丝丝破碎的枯黄在清寒间空舞,破碎。

    以下对C语言函数的有关描述中,不正确的描述是: A、C函数既可以嵌套ABC。 解析:A、C函数不可以嵌套定义。B、定义成void类型的函数没有返回值。C、不必要放在同一源程序,只要分别编译后连接起来则可。D、单向的值传递,只能从实参到形参 2.ABCD 解析:都对啊 4.ACD 解析:列数(二维数组中第二个下标)不能省略有些人,我们叫着亲爱的,却并不喜欢,有些人我们骂着傻逼,却是真的爱着。

    c语言里递归函数里定义的变量是否会随着调用自身而小弟刚学C语言,学到函数的递归问题,查了很多资料都找不到一个准确的答是的,局部变量会新定义一次,不过仅局限于局部变量(全局变量和静态变量都是全局的,要是还没学暂时不用管)。 并不能说是“同时”,应该说是“同样”,时间上肯定是按照调用的先后顺序的。 递归确实会让程序变慢。

    C语言中如何从递归函数中退出呢。

    递归函数定义:编程语言中,函数Func()直接或间接调用函数本身,则该函数称为递归函数。递归函数不能定义为内联函数。在数学上,关于递归函数的定义如下:对于某一函数f(x),其定义域是集合A,那么若对于A集合中的某一个值X0。

    C++编程 编写递归函数power(a,n)分享出a的n次方最痛苦的不是生离死别,而是他已经风轻云淡,而你还在念念不忘。

    编写递归函数power(a,n)分享出a的n次方,然后编制主函数,输入不同的实数a//经运行,已实现上述功能 #include using namespace std; float power(float a,int n) { if(n人生没有彩排,每天都是直播,不仅收视率低,而且工资不高。

    递归算法中递归函数的参数+1和在函数里面定义变量打个比方 第一次调用这个函数的时候 depth = 1; 现在这个函数还有没有执行完, 我又调了这个函数,并且传递 depth + 1 这一次 这个函数里面的depth 是不是就等于2了?青春这东西,我们总是嫌它不够好,又怕它走得太匆忙。

    在数学上,关于递归函数的定义如下:对于某一函数f(x),其定义域是集合A,那么若对于A集合中的某一个值X0,其函数值f(x0)由f(f(x0))决定,那么就称f(x)为递归函数。 在编程语言中,把直接或间接地调用自身的函数称为递归函数。

    展开全文
  • Python二级等级考试电子教案
  • 二、如何正确的使用递归函数? 一般来说,递归函数是需要有边界条件的,如果没有边界条件,那么函数就会无限制的调用本身,从而出现函数死循环,就比如下面这个例子。 function fn(){ //定义函数fn console.log(1...
  • 函数递归

    多人点赞 2021-11-03 08:48:06
    函数递归 这是本章的重点内容 一.什么是递归? 大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为: 人理解迭代,神理解递归。 人理解迭代,神理解递归。毋庸置疑地,递归...
  • 递归函数解析2020-12-11

    2020-12-09 13:28:22
    自述:第一次接触递归函数时,理解在函数内部为什么有调用本身?为什么会使用递归函数?有什么优点?调用本身后再次进入递归函数体内,怎么退出第二次甚至是第n次的递归函数,有没有条件来判断退出?退出的顺序是...
  • 函数递归与迭代

    2022-05-12 21:25:07
    函数递归与迭代实现斐波那契数 ,n的阶乘,求字符串长度,顺序打印数值的每一位
  • 递归函数简单的理解就是在不停地调用自己,如果懂请参照“讲解”。其实递归函数在使用时只需要明确一点:我写这个函数是干嘛用的,比如在用递归写计算N!的C语言程序时,只需要明确我写的函数是用来计算当前传入...
  • C++递归函数

    万次阅读 多人点赞 2018-03-28 15:22:12
    C++递归函数【递归,就是在运行的过程中调用自己】比如:(点击了下面的递归,搜索结果还是递归) A.构成递归需具备的条件: 1.子问题须与原始问题为同样的事,且更为简单。 2.能无限制的调用本身,必须有个...
  • 一文读懂递归函数

    2020-11-24 23:39:17
    1、什么是递归函数递归函数就是直接或间接调用自身的函数。 2、什么情况下可以使用递归函数。 (1)存在限制条件,且当到达限制条件时递归便不再继续。 (2)每次递归之后越来越接近限制条件。 3、递归函数举例...
  • 递归是什么?关于递归的详细介绍

    千次阅读 2021-07-27 03:35:21
    递归,又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。递归一词还较常用于描述以自相似方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现...
  • 【C语言】函数递归(详解)

    千次阅读 多人点赞 2022-01-12 21:11:18
    函数递归思想
  • 68_递归函数

    2020-08-28 15:14:31
    递归函数123使用递归计算n的阶乘结果(5!=5*4*3*2*1)测试递归算法树形递归(裴波那契)尾递归链表实现 68.递归函数 71 递归函数指的是:自己调用自己的函数,在函数体内部直接或间接的自己调用自己。递归类 似于...
  • 我有一项工作要写一个递归函数,该函数以相反的顺序写一个正整数的数字.我的问题是该功能无法正确显示反向.我知道我应该在显示数字时使用%或10,而在递归调用中以及在基本情况应该为#include using namespace std;int...
  • 开篇递归函数(二):编写递归函数的思路和技巧递归函数(三):归纳原理递归函数(四):全函数与计算的可终止性递归函数(五):递归集与递归可枚举集递归函数(六):最多有多少个程序递归函数(七):动点算子...
  • js递归函数解析:阶乘示例

    千次阅读 2019-11-12 20:28:53
    一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算...
  • C语言递归函数的执行与求解导语:函数的递归调用是在调用一个函数的执行过程中,直接或间接地调用该函数本身,使用递归函数的程序结构清晰,简单、易懂。下面就由小编为大家介绍一下C语言递归函数的执行与求解,欢迎...
  • 函数式编程提倡使用递归,而不是循环。递归在某些场合下更优雅、更简洁。
  • 考虑到有的读者经常去读者圈提问题,在此建立一个读者群,扫描群二维码可以加群讨论: (若群满了,可加“madacui”微信号拉您进群,请备注:算法读者,谢谢~) 另外,本课程的代码请戳这里。 如何分析递归程序 ...
  • Python之递归函数

    千次阅读 2018-10-14 20:07:16
    前言 说到递归,如果是从其他编程语言转到 Python 的...OK,废话多说,来看一下 Python 中递归函数的写法。 定义 所谓递归,就是调用函数自身。 简单的说就是函数自己调用自己。递归可能难以理解,也可能非常简...
  • 递归函数总结

    2018-04-01 20:42:20
    知识点递归函数定义直接或间接调用自身的函数.递归函数调用自身的目的是为了使复杂问题简单化,循环调用自身,直到问题可以直接被解决时,停止调用自身函数,也即是递归函数有递归终止条件.递归两个要素1.递归终止...
  • Python递归函数正确理解与使用

    千次阅读 2018-06-02 19:08:46
    先看一个题目:题面描述 小明很喜欢学数学,并且喜欢做一些奇怪的题,这天他想知道对于给定的 N ,有多少个 M 满足“ M&lt;=N, gcd(N,M)==1, M 是偶数”。请你编写程序帮助小明解决这个问题。 输入数据 输入数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,846
精华内容 32,338
热门标签
关键字:

关于递归函数描述不正确的是