C语言,递归函数问题

C语言,递归函数问题,第1张

return; 返回调用点;

递归,返回调用他的那个函数,调用他的那个地方;

递归调用,返回自己调用自己的地方,或者第一次调用他的地方,这个只有分析代码才知道具体情况。

无返回值函数,相当于,BASIC 的子程序,pascal 的过程,返回调用语句处,以便执行下一条语句,实际返回点是下一条指令,然后可能还要,再执行些,调用后的扫尾的工作,才来到下一步执行。

有返回值函数,返回使用函数值的地方。

不管哪一种,都是返回调用处,继续向下执行。

函数调用,首先要执行计算参数的任务,然后执行参数传递的工作,然后才轮到调用函数。

函数调用前,可能还要保存现场,具体就是寄存器压栈保存,防止函数调用时,现场被破坏

调用完成,要恢复现场,恢复寄存器的值,具体就是从堆栈中,d出保存的寄存器数据值。

递归函数,一般包含:

1)退出条件,适当条件下函数退出递归。

2)递归部分(自调用,并适当更新,执行条件,函数参数,全局变量等)

3)执行部分,如打印节点信息等。

看递归代码,

1)首先,看何时退出递归(程序不再执行自调用)

2)看递归执行顺序

3)看执行代码,干了什么。和递归部分的执行的先后顺序。

4)有些递归函数,没有独立的执行部分,只有一些表达式,看他先后执行那些表达式。

5)有些递归函数,只看函数本身看不出是递归函数,因为这个函数,会调用别的函数,别的函数又会再回头调用该函数本身。

这就要查看,函数调用链,里面是否调用了自己。

PS:

不管是否递归,函数总是要干点什么的(函数的功能)。

所以,看递归函数,不能光看函数,自己调用自己的,递归部分;

还要看,非递归部分干了什么,这个部分,才是递归实际干的事情;

递归不过是一种重复而已,通过递归部分反复调用自己;

从而重复执行非递归部分,完成递归函数的功能。

C,C++ :return 语句有两个功能

1)返回调用处,程序执行下一步。

2)返回执行的结果

1)这个功能,返回的函数调用的位置,执行下步的程序。

在表达式中,函数调用会得到一个结果,程序解析表达式的时候遇到函数,会调用函数

代码执行,会因此跳到函数内部,开始执行函数内部的程序,执行完毕;

会得到一个结果,这个结果就是函数的返回值,也叫函数值,

这时函数调用就结束了,程序返回继续解析表达式,并用函数返回值代替函数,继续解析(计 算)表达式。

1) 如果表达式比较复杂的话;如果表达式解析没有完成,函数返回解析表达式的断点处,

如果完成了,执行下一条语句,

2)如果表达式比较简单,函数返回后,会执行下一条语句。

单独的一条函数调用,称为函数调用表达式。

所以,C 几乎一切都是表达式。

任何表达式,加上分号,就是一条语句。

所以 单独的函数调用加上分号,构成一条单独的函数调用表达式语句,就是函数调用语句。

函数调用语句,执行完成后返回调用点,执行逻辑上的下一条语句。

总结:

函数返回

1)返回值:函数返回值,放在特定的寄存器中(

X86,WINDOWS WIN32 VC eax---char,int 指针; edx:eax---long long,__int64;协处理器的浮点堆栈寄存器 float,double,long double :ST(0) ),如果返回值的类型,比较长,会使用一个全局变量(static???)存放返回值,并把该全局变量的指针,放在特定的寄存器中(X86,WINDOWS WIN32 VC:

eax)。

2)返回位置:函数结束,程序返回调用点。继续执行。

注意:由于函数可以用在表达式中,所以函数实际返回,解析表达式的断点处,继续解析表达式。

函数调用本身,就是一个表达式,称为函数调用表达式。

如何使用递归函数的返回值

给定一个二叉树,返回所有从根节点到叶子节点的路径。

说明: 叶子节点是指没有子节点的节点。

示例:

给定一个二叉树,它的每个结点都存放着一个整数值。

找出路径和等于给定数值的路径总数。

路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

示例:

代码中,sum_of_odd_numbers() 函数接收一个整数 n 作为参数,如果 n 等于 1,则返回 1;否则返回 (2 n - 1) 加上 sum_of_odd_numbers(n - 1) 的结果。在主程序中,首先通过 scanf() 函数获取用户输入的整数 n,然后调用 sum_of_odd_numbers() 函数计算 1+3+5+7++(2n-1) 的和,并将结果打印输出。

int sum(int n)

{

    if(n==1) return 1;

    else return sum(n-1)+n;

}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12153700.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存