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

2020-12-11 21:08:06 字数 5991 阅读 3027

1楼:匿名用户

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

2楼:匿名用户

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

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

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

3楼:潇潇小百

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也是这样的

4楼:匿名用户

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

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<

5楼:匿名用户

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

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

6楼:龍__鳳

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

7楼:匿名用户

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

8楼:小白丶风

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

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

9楼:匿名用户

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

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

intrecursive()

10楼:gta小鸡

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

11楼:wolove书

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

如图蓝色选择条部分,为什么递归完成之后还要把每一次递归后面的输出语句执行一遍呢?

12楼:匿名用户

你会整体思维吗?

printarray(10)是由两部分组成的,printarray(9)和sysem.out.println(value[9])

你说是执行完了printarray(9)再执行sysem.out.println(value[9])呢?还是反过来呢?

答案不是很明显了吗?

13楼:匿名用户

你把sysem.out.println这句放到if(i==0)前面就行了。

c语言用递归颠倒一个栈,动态栈,不知道怎么递归。分两次递归,一次压栈,一次出栈。菜鸡在这里求指教了

14楼:匿名用户

按照题意应该是一个

int i=1;用来给数组需要赋值定位到具体存储单元,此处从数组第二开始赋值。下表0第一

int a;入栈单元用来临时存储数据

f(n)

else f(n-1);

}出栈是逆序存储到存储单元(此例为了方便,上面的是加了一个数组。你可以直接使用一个数组,使用对换的方法。)

仅供参考。

如何设计递归算法

1.确定递归公式

2.确定边界(终了)条件

练习:用递归的方法完成下列问题

1.求数组中的最大数

2.1+2+3+...+n

3.求n个整数的积

4.求n个整数的平均值

5.求n个自然数的最大公约数与最小公倍数

6.有一对雌雄兔,每两个月就繁殖雌雄各一对兔子.问n个月后共有多少对兔子

7.已知:数列1,1,2,4,7,13,24,44,...求数列的第 n项.

2.3典型例题

例3 快速排序

快速排序的思想是:先从数据序列中选一个元素,并将序列中所有比该元素小的元素都放到它的右边或左边,再对左右两边分别用同样的方法处之直到每一个待处理的序列的长度为1,处理结束.

程序如下:12

3456

78910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

programkspv;

vara:array[0..10000]oflongint;

i,n:integer;

procedurequicksort(l,r:longint);

vari,j,mid:longint;

begin

i:=l;j:=r;mid:=a[(l+r)div2];

repeat

whilea[i]middodec(j);

ifi<=jthen

begin

a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];

inc(i);dec(j);

end;

untili>j;

ifi

ifl

end;

begin

write('inputdata:');

readln(n);

fori:=1tondoread(a[i]);

writeln;

quicksort(1,n);

write('outputdata:');

fori:=1tondowrite(a[i],'');

writeln;

end.

【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