c语言的递归问题为什么会倒过来执行一次

2021-03-06 07:47:15 字数 5511 阅读 9185

1楼:潇潇小百

void up_and_down(int n)主要在这里,当n=1的时候程序执行到

if(n<4)

up_and_down(n+1);

的时候,就会由于递归的原因回到void up_and_down函数打开头去执行n = n+1的情况了,也就是说,当n=1时,刚开始是不执行if后面那个printf("level %d: n location %p\n",n,&n);的要等重重递归使得n=4的时候才执行n=4时的if后面那个printf语句的,然后再返回上一层递归,也就是n=3的时候,再执行n=3的时候的printf,n=2,n=1也是这样的

2楼:匿名用户

首先先跟你说下,你是不是忘了你的递归函数,首尾都要输出。注意程序缩进,养成好习惯。

voidup_and_down(intn)

以你的例子而言,首先是过程(此时n<4),在调用递归函数前先要执行第一行的输出语句,然后调用递归语句up_and_down(1+1);进入下一层函数,依次类推,你看到了1、2、3、4。当n=4时阶段结束,不再调用递归函数,但仍要依照顺序执行此函数全部语句,所以要输出4,函数执行完毕后,要返回函数调用处(up_and_down(3+1);的下一句),继续按顺序执行输出语句printf("level %d: n location %p\n",n,&n); 输出3,同理再依次输出2、1

所以最后看到的是1 2 3 4 4 3 2 1

up_and_down(1);

printf("1");

up_and_down(1+1);

printf("2");

up_and_down(2+1);

printf("3");

up_and_down(3+1);

printf("4");

printf("4");

printf("3");

printf("2");

printf("1");

递归解决问题本来就是先,直到遇到终止条件,然后再逐层返回,并不是算到最后一层,就直接返回给第一层调用处。以阶乘为例:

rescuvie(5)}}}

}}}}}}}}}

120由于递归的这种特性,所以要占据很大的空间,如果一直没有遇到递归终止条件,则会一直进行下去,直到资源耗尽。阶乘数大于某一程度,计算机就无法解决了。

因此与迭代相比递归是十分低效的算法,不过由于递归有抽象的表达能力,只要有递推关系,不必求出具体表达式就可以求解问题,所以应用还是比较广泛的。

以上方法都被称为线性递归,也可以说是传统的递归。而你后面说的尾递归,是另一种新的方法,与传统的线性递归相比,可节省资源所占资源,避免资源耗尽的问题。

下面举阶乘尾递归的例子

longtailrescuvie(longn,longa)

longtailrescuvie(longn)

tailrescuvie(5)

tailrescuvie(5,1)

tailrescuvie(4,5)

tailrescuvie(3,20)

tailrescuvie(2,60)

tailrescuvie(1,120)

1-2返回120

2-3返回120

3-4返回120

4-5返回120

tailrescuvie(5,1)返回120给tailrescuvie(5)

返回并输出120

很容易看出,普通的线性递归比尾递归更加消耗资源,在实现上说,每次重复的过程调用都使得调用链条不断加长,系统不得不使用栈进行数据保存和恢复。而尾递归就不存在这样的问题,因为他的状态完全由n和a保存。

就思想而言,尾递归其实也是一种线性递归,不过它把运算结果(或路径)传给了下一层,编译器可以利用这一特点对语句进行优化,节省所占资源。而且当遇到终止条件后,虽然形式上仍要返回,但计算已经结束,只要将值不断返回即可,不必再运算,因此每次分配的内存不会因为递归而扩大。

尾递归适用于运算对当前递归路径有依赖的问题,传统递归适用于运算对更深层递归有依赖的问题。从效率来看两者都差不多,不过编译器对尾递归可以进行优化,大大减小尾递归所占资源,而普通递归,编译器的优化没太大影响。(如果都不优化,其实所占资源差不多)

如果你改写下long tailrescuvie(long n, long a);使得它在头尾输出n(递归调用前后都输出),你会发现输出结果仍然是,n、n-1 ……2 1 1 2……n-1、n的过程。

不存在你说的到一半就结束了。

longtailrescuvie(longn,longa){

cout<

3楼:匿名用户

c语言;自顶向下,依次执行

执行完print语句后,需要返回到fun后面(因为if条件已经不满足),所以不能再调用fun,而是执行相应的print语句

4楼:龍__鳳

这是因为没执行一个up_and_down()函数都会有两个输出,对于你的程序,总过输出8次,自然是先输出1,2,3,4,然后又输出4,3,2,1了

5楼:匿名用户

up_and_down(n+1);这句执行完,就直接进入了递归, printf("level %d: n location %p\n",n,&n);这句还没有执行,所以最后一层执行完之后会一次返回到上一层,因此倒着输出了4 3 2 1

6楼:小白丶风

当然是输出8行啦,你up_and_down方法里边有两个printf,递归的时候,都是执行了第一句,然后判断,递归调用,只到n=4的时候,输出了第一个4,if判断不在递归,执行了第二个print,输出了第二个4,然后完成了这层递归调用,返回前一层n=3的递归,输出第二个3完成了这层调用再返回前一层。。。只到输出第二个1,递归才结束,只要删掉方法里第二个printf输出的就是4行了

c语言的递归问题 为什么会倒过来执行一次

7楼:孟羽然

其实递归调用就是一个“压栈”/“弹栈”的过程。

每一次递归调用,就会把当前的现场压栈,然后调用下一层;调用完毕后,从栈中恢复现场,继续执行。

拿你这个递归函数来看,在入口和出口处分别打印了一条日志。

入口处的日志,一进入函数即被执行,然后进行递归调用,递归返回后,再打印出口的日志。

这样总体调用效果就像这样:

1 # 第1层递归入口| 2 # 第2层递归入口| | 3 # 第3层递归入口| | | 4 # 第4层递归入口| | | 4 # 第4层递归出口,返回上层| | 3 # 第3层递归出口,返回上层| 2 # 第2层递归出口,返回上层1 # 第1层递归出口,返回上层

8楼:匿名用户

void up_and_down(int n)那么一步步剖析,n与指令流:

n 指令流

1 输出,进入子过程

2 输出,进入子过程

3 输出,进入子过程

4 输出,输出

3 从子过程返回,输出

2 从子过程返回,输出

1 从子过程返回,输出

注意每一个递归中有一前一后两个printf哦

9楼:孙永超

**一下就知道原因了

c语言递归的问题,递归结束之后为什么还要倒过来一遍?

10楼:匿名用户

void函数是可以不写return语句的,没有return也是return。

11楼:匿名用户

函数是否要return 一个值,是看逻辑需求的需要的

现在这个函数定义没有返回,而是直接打印出来~

c语言递归练习题,用debug自己搞了一遍还是搞不懂为什么会倒着输出一遍,求大神给讲讲

12楼:匿名用户

这个逻辑上很简单啊,读取一个字符,如果不是eof,就继续递归,直到读出eof,然后显示字符,结束。

所以你的程序里,if及下面的递归调用改一下就好。自己试试吧!

intrecursive()

13楼:gta小鸡

把每次调用recursive()的地方都用recursive的整个函数体替换一遍,就像俄罗斯套娃一样,再来看这个程序,就懂了。

14楼:wolove书

因为是递归,相当于后进先出的栈。停止输入后开始输出,倒着来一遍 逆序了

【c语言】函数递归问题,题目见**,答案为什么是d?求解!为什么是倒着输出的?!

15楼:蜻蜓点水

递归函数式自己调用自己,那么那个函数会一直执行到某个特定满足的条件的时候,才会从里面忘外面返回啊

比如就是f(f(f(3)));

进去之后,是从最里层的函数返回吧,那么就是倒着了如果用再具体一点,就是堆栈的先进后出了,上一级的函数的东西都在底下,只有最后一层的在栈顶

16楼:带着光圈的小鸡

由于子函数调用在printf()语句之前,所以得到符合条件(x/2>0)为假时,才能跳过fun()调用,

执行printf()语句;而啥时候符合呢,请看程序运行:

第一次调用fun()时x=20,x/2=10>0,所以继续调用fun(8);

x=8,x/2=4>0,所以继续调用fun(2);

x=2,x/2=1>0,继续调用fun(-1);

x=-1,x/2<0;此时if语句条件为假,执行printf() 输出-1,

然后返回上级,仍然执行printf(),而此时x=2,输出2然后返回上级,仍然执行printf(),而此时x=8,输出8然后返回上级,仍然执行printf(),而此时x=20,输出20

17楼:香山雪叶

fun(20)

printf("%d ",2);

}printf("%d ",8);

}printf("%d ",20);

}递归解释起来还挺麻烦的,我把递归了,就如上,函数从上往下执行,就分别输出 -1 2 8 20了

再加上花括号

18楼:匿名用户

这就是递归啊。在fun(20)里面调用fun(18), fun(18)不执行完,fun(20)中的printf不会执行,fun(18)里面调用fun(7), fun(7)不执行完,fun(18)中的printf不会执行。以此类推。

就可以理解了

19楼:匿名用户

这个是递归啊 碰到函数了 当然函数先执行 所以 输入20->fun(8)

->fun(2)

->fun(-1) -1不满足判断条件

->执行 printf -1

->返回到上层 printf 2

依这种思路运行 所以倒序输出哦

C语言递归的问题,递归结束之后为什么还要倒过来一遍

1楼 匿名用户 void函数是可以不写return语句的,没有return也是return。 2楼 匿名用户 函数是否要return 一个值,是看逻辑需求的需要的 现在这个函数定义没有返回,而是直接打印出来 c语言的递归问题 为什么会倒过来执行一次 3楼 潇潇小百 void up and down ...

为什么我会经常被开恶作剧,我是一个极爱开玩笑 恶作剧的好孩子!我经常和同事开...经常开过头...还被人用人身攻击的言语攻击.....

1楼 匿名用户 对啊 你怎么这么开不起玩笑 女孩子就是喜欢你 才跟你闹嘛 这么小气 还骂人 男生有点心胸好吧 我的烦恼来自于我总是被开玩笑,捉弄不开心,要怎么样更加成熟的表现?都说我小学生 ?心里脏话骂了一遍 50 2楼 我要次药 看你多大有bai道理,不过最du好的处理方式是一zhi般不喜欢的玩笑...