网站建设资讯

NEWS

网站建设资讯

c语言递归指针函数,c语言递归函数怎么理解

C语言:指针作函数参数,运用递归,排列问题

long

成都创新互联是一家集网站建设,永和企业网站建设,永和品牌网站建设,网站定制,永和网站建设报价,网络营销,网络优化,永和网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

int

(*p)();

long

int

f(int

n)

{if

(n3)

return

(*p)(n-1)+(*p)(n-3);

else

return

n;

}

main()

{

long

int

r;

int

a;

p=f;

scanf("%d",a);

r=(*p)(a);

printf("%ld",r);

}

另外和你说一下,你用不用函数指针写程序,与你的程序的运行速度是没关系的,递归主要是会消耗大量的栈空间.就是改成函数指针,也不会快些

C语言 指针 递归函数

你上面的那个函数要求的返回值是long

int长整型的,但是你在n3时return的根本就不是这种类型的return

(*p)(n-1)+(*p)(n-3)这样的用法是绝对错误的,你没定义p是什么样的指针,而且将n+1和n-3强制转换为指针类型,再做加法,这是完全不对的(你可以去看看指针方面的知识)至于写成递归很简单啊:

long

int

f(int

n)

{

if(n3)

return

f(n+1)+f(n-3)

;

else

return

n;

}

C++里怎样定义递归函数指针

比如:void

g(char);

fp

=

fp();

//运行f函数,得到函数指针

fp

=

fp();

//运行f函数,得到函数指针

//...and

so

on我们现在是在C++里,不是在C或是汇编里,在那些语言里没有类型检查,只要是存储空间一样大,什么都可以相互等同。在C++里,我们享受了类型安全的优点,现在该修补它带来的一些“缺陷”来当作回报了。也许有人很快会在脑海里闪过一些代码,类似于:typedef

FuncPtr

(*

FuncPtr)();

//对应的函数指针的定义FuncPtr

f()

//一个函数的定义{//do

something...

return

f;

//返回函数的指针

}编译器会产生这样的等同代码:void

function(TypeA

_tmp_){TypeA

a;_tmp_

=

a;

//these

are

for

"return

a;"return;}注意到函数的返回类型(_tmp_的类型)和a的类型是一样的,都是TypeA。那么能不能使_tmp_和a的类型不同呢?当然可以了!只要a能转化成_tmp_,或说_tmp_能从a构建出来,比如:class

TypeA{};

class

TypeB{TypeB(){}TypeB(const

TypeA

){}

//construct

B

from

A

};从一个typeA类型的对象可以构建一个TypeB类型的对象,那么我们可以这样修改上面的函数:TypeB

function(){TypeA

a;return

a;

//construct

B-object

from

a

}我们讨论到这里,也许有人会想到我下一步要做什么了!对了,由于在函数申明中,函数返回的值类型不能是函数本身的指针类型——不能简单的递规typedef,这在前面的例子里大家都看到了——那么我们需要一个类型转化:从函数本身的指针类型转化成另一个类型,再在赋值的时候转化回来,就可以了。于是我们定义的了一个类:class

_FuncPtrClass{//something

magic

here...

return

f;}typedef

_FuncPtrClass

(*

FuncPtr)();

//函数指针类型FuncPtr定义我们来看看_FuncPtrClass类应该具有哪些特点。首先,它要能从FuncPtr对象构建出来,并且要负责传递这个指针的值,所以它需要一个FuncPtr类型的成员变量,和一个定制的构造函数。注意,FuncPtr的定义是在_FuncPtrClass之后的,所以实际上在_FuncPtrClass内应该重新定义FuncPtr:class

_FuncPtrClass{public:typedef

_FuncPtrClass

(*

FuncPtrInClass)();

//重新定义FuncPtr为FuncPtrInClass

_FuncPtrClass(FuncPtrInClass

f):f_(f){}

//定制的构造函数private:FuncPtrInClass

f_;

//FuncPtrInClass类型的成员变量

public:typedef

_FuncPtrClass

(*

FuncPtrInClass)();

_FuncPtrClass(FuncPtrInClass

f):f_(f){}

operator

FuncPtrInClass(){return

f_;}

//从_FuncPtrClass到FuncPtrInClass转换的函数private:FuncPtrInClass

f_;

return

f;}typedef

_FuncPtrClass

(*

FuncPtr)();我们就能放心的运行以前的代码了:FuncPtr

fp

=

f();

//运行f函数,得到函数指针

fp

=

fp();

//运行f函数,得到函数指针

fp

=

fp();

//运行f函数,得到函数指针

//...and

so

on好了,大功告成!

也许有人会认为我这里讲的例子一点实际用处也没有,的确,我也这样认为。不过我并不认为这个技巧是没用的。任何人说某个东西一点用处也没有,都有点武断的嫌疑。

C语言,递归函数问题

return; 返回调用点;

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

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

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

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

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

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

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

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

递归函数,一般包含:

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)返回位置:函数结束,程序返回调用点。继续执行。

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

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

C语言怎样使用指针来递归函数!~~

我现在看不懂你的程序用途。 最明显的错误就是函数 int page(int *prt) 这应该返回int的值。 而在你这个函数体中没有return语句。 int page_2(int *);这句是否为一个函数的声明?但之后没有看到函数的定义部分。 也没有调用的地方。是否可以删除?函数是不在另一函数体内部定义的。

C语言递归建立二叉树时遇到的指针问题:建立的二叉树无法返回调用函数

你的说法是有问题的。

通常说,通过指针作为函数的参数,可以再被调函数中,修改实际参数所指向的变量的值,也就是把改变传递给主调函数。

但是,请看清楚上面的说法,“通过指针作为函数的参数,可以再被调函数中,修改实际参数所指向的变量的值”。是修改实际参数所指向的变量的值,而不是修改实际参数本身。

你的代码里面是要修改实际参数本身,而不是修改实际参数所指向变量。

要完成这个功能,你就需要指向指针的指针了


网站标题:c语言递归指针函数,c语言递归函数怎么理解
分享地址:http://cdweb.net/article/dsiihec.html