关闭→
当前位置:科普经验站>综合知识>c语言递归函数怎么写

c语言递归函数怎么写

科普经验站 人气:2.46W
1.c语言 函数递归调用的简单例子

=#include <stdio.h>

c语言递归函数怎么写

/// 求阶乘函数

/// 递归思想

/// n! = n * (n-1) * (n-2) * 。 * 1

/// n! = n * [(n-1) * (n-2) * 。 * 1]

/// n! = n * (n-1)! 递归方程

/// 这是递归实现

unsigned Factorial(unsigned int n)

{

if (n == 0) return 1; // 对于0的阶乘,当n=0时,递归返回

return n * Factorial(n-1); // 递归调用

}

void main()

{

int n = 3;

printf("3! = %d",Factorial(n));

}

2.如何使用C语言递归函数

递归:函数下一次的参数是函数自身上一次的输出值。(也就是说,函数的下一次取决于上一次的结果,自身依赖)。

也正是因为如此,这样的函数必须有终止值(即递归必须有一个条件限定)。否则就会进入死循环。

“递归”分成“直接递归”、“简介递归”。具体可以参考我的博客(点击, ,查看,有代码有具体示例解释)。

给出一个求n!的C递归:

int Fun(int n)

{

if (n==0 || n==1) return 1;

return Fun(n-1)*n;

}

Sorry, 程序略有写错误,主函数请这样修改:

int main() { int x=0,n=0; printf("输入x:"); scanf("%d",&x); printf("输入n:"); scanf("%d",&n); double sum=0; for(int i=1;i<=n;i+=2) { sum+=Result(x,n); }printf("结果是:%lf",sum); system("pause"); }

3.c语言中的递归

原发布者:zhoujiahaohao2

1.编写计算X的Y次幂的递归函数getpower(intx,int),并在主程序中实现输入输出。#include"stdio.h"longgetpower(intx,inty){if(y==1)returnx;elsereturnx*getpower(x,y-1);}voidmain(){intnum,power;longanswer;printf("pleaseinputanumber:");scanf("%d",&num);printf("pleaseinputthenumber'spowerseries:");scanf("%d",&power);answer=getpower(num,power);printf("结果是:%ldn",answer);}结果说明:输入61再输入5求得61的5次幂为844596301.2编写计算学生年龄的递归函数。#includeintage(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;returnc;}voidmain(){intn=5;printf("thefivestudent'sageis:%dyearsoldn",age(n));}结果说明:第五个学生的年龄为18岁。3.编写递归函数实现Ackman函数。#includeAcm(intm,intn){if(m==0)returnn+1;elseif(n==0)returnAcm(m-1,1);elsereturnAcm(m-1,Acm(m,n-1));}intmain(){printf("Acm(2,1)=%dn",Acm(2,1));printf("Acm(3,2)=%dn",Acm(3,2));return0;}结果说明:利用递归函数求得Acm(2,1)=5,Acm(3,2)=29.实验小结:

4.C语言 递归函数

//方法一,不需将转换后的字符存储在字符数组中

#include

void change(int );

int main()

{

int n;

scanf("%d",&n);

change(n);

printf("n");

return 0;

}

void change(int num)

{

if(num==0)return ;

change(num/10);

printf("%d",num%10);

}

//方法二,先将转换后的字符存储在字符数组中

#include

#define LEN 100

int m=0;

void change(int ,char *);

int main()

{

int n,i;

char a[LEN];

for(i=0;ia[i]='';

scanf("%d",&n);

change(n,a);

printf("%s",a);

printf("n");

return 0;

}

void change(int num,char *s)

{

if(num==0)return ;

change(num/10,s);

s[m++]=(char)(num%10+'0');

}

5.讲一下c语言中递归函数的使用方法

递归函数有三点要求:

1,递归的终止点,即递归函数的出口

2,不断的递归调用自身

3,递归函数主体内容,即递归函数需要做的事情

ps:3一般可以放在2的前面或者后面,一般1放最前面。另外,2和3可以根据不同的需要合并,比如,有时候递归函数的主体就是返回调用下层函数所得到的结果。

具体例子如下:

void fun(int n)

{

if(n<=0) return; //1 这是递归的终点,即出口

fun(n-1); //2、递归函数自身的调用

cout<<n<<endl; //3 递归函数的主体内容

}

2,3合并的情况

int fun(int n)

{

if(n<=0) return 0;

return fun(n-1)+fun(n-2); //2 3合并

}

6.C语言关于函数的递归

你的递归程序是错的,我转来个对的,带讲解的,你看看。

语言函数的递归和调用 一、基本内容: C语言中的函数可以递归调用,即:可以直接(简单递归)或间接(间接递归)地自己调自己。 要点: 1、C语言函数可以递归调用。

2、可以通过直接或间接两种方式调用。目前只讨论直接递归调用。

二、递归条件 采用递归方法来解决问题,必须符合以下三个条件: 1、可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减。 说明:解决问题的方法相同,调用函数的参数每次不同(有规律的递增或递减),如果没有规律也就不能适用递归调用。

2、可以应用这个转化过程使问题得到解决。 说明:使用其他的办法比较麻烦或很难解决,而使用递归的方法可以很好地解决问题。

3、必定要有一个明确的结束递归的条件。 说明:一定要能够在适当的地方结束递归调用。

不然可能导致系统崩溃。 三、递归实例 例:使用递归的方法求n! 当n>1时,求n!的问题可以转化为n*(n-1)!的新问题。

比如n=5: 第一部分:5*4*3*2*1 n*(n-1)! 第二部分:4*3*2*1 (n-1)*(n-2)! 第三部分:3*2*1 (n-2)(n-3)! 第四部分:2*1 (n-3)(n-4)! 第五部分:1 (n-5)! 5-5=0,得到值1,结束递归。 源程序: fac(int n) {int t; if(n==1)||(n==0) return 1; else { t=n*fac(n-1); return t; } } main( ) {int m,y; printf(“Enter m:”); scanf(“%d”,&m); if(m<0) printf(“Input data Error!n”); else {y=fac(m); printf(“n%d! =%d n”,m,y); } } 四、递归说明 1、当函数自己调用自己时,系统将自动把函数中当前的变量和形参暂时保留起来,在新一轮的调用过程中,系统为新调用的函数所用到的变量和形参开辟另外的存储单元(内存空间)。

每次调用函数所使用的变量在不同的内存空间。 2、递归调用的层次越多,同名变量的占用的存储单元也就越多。

一定要记住,每次函数的调用,系统都会为该函数的变量开辟新的内存空间。 3、当本次调用的函数运行结束时,系统将释放本次调用时所占用的内存空间。

程序的流程返回到上一层的调用点,同时取得当初进入该层时,函数中的变量和形参所占用的内存空间的数据。 4、所有递归问题都可以用非递归的方法来解决,但对于一些比较复杂的递归问题用非递归的方法往往使程序变得十分复杂难以读懂,而函数的递归调用在解决这类问题时能使程序简洁明了有较好的可读性;但由于递归调用过程中,系统要为每一层调用中的变量开辟内存空间、要记住每一层调用后的返回点、要增加许多额外的开销,因此函数的递归调用通常会降低程序的运行效率。

五、程序流程 fac(int n) /*每次调用使用不同的参数*/ { int t; /*每次调用都会为变量t开辟不同的内存空间*/ if(n==1)||(n==0) /*当满足这些条件返回1 */ return 1; else { t=n*fac(n-1); /*每次程序运行到此处就会用n-1作为参数再调用一次本函数,此处是调用点*/ return t; /*只有在上一句调用的所有过程全部结束时才运行到此处。*/ } }。

7.c语言递归函数

递归函数:

编程语言中,函数Func(Type a,……)直接或间接调用函数本身,则该函数称为递归函数。递归函数不能定义为内联函数。

在数学上,关于递归函数的定义如下:对于某一函数f(x),其定义域是集合A,那么若对于A集合中的某一个值X0,其函数值f(x0)由f(f(x0))决定,那么就称f(x)为递归函数。

函数介绍:

在数理逻辑和计算机科学中,递归函数或μ-递归函数是一类从自然数到自然数的函数,它是在某种直觉意义上是"可计算的" 。事实上,在可计算性理论中证明了递归函数精确的是图灵机的可计算函数。递归函数有关于原始递归函数,并且它们的归纳定义(见下)建造在原始递归函数之上。但是,不是所有递归函数都是原始递归函数 — 最著名的这种函数是阿克曼函数。

其他等价的函数类是λ-递归函数和马尔可夫算法可计算的函数。

例子:

//代码1

void func()

{

//。

if(。)

func();

else

//。

}

条件:

一个含直接或间接调用本函数语句的函数被称之为递归函数,在上面的例子中能够看出,它必须满足以下两个条件:

1) 在每一次调用自己时,必须是(在某种意义上)更接近于解;

2) 必须有一个终止处理或计算的准则。

梵塔的递归函数:

//C

void hanoi(int n,char x,char y,char z)

{

if(n==1)

move(x,1,z);

else

{

hanoi(n-1,x,z,y);

move(x,n,z);

hanoi(n-1,y,x,z);

}

}

8.C语言函数递归

几乎每一本C 语言基础的书都讲到了函数递归的问题,但是初学者仍然容易在这个地方犯错误。

先看看下面的例子:void fun(int i){ if (i>0) { fun(i/2); } printf("%dn",i);}intmain(){ fun(10); return 0;}问:输出结果是什么?这是我上课时,一个学生问我的问题。他不明白为什么输出的结果会是这样:012510他认为应该输出0。

因为当i 小于或等于0 时递归调用结束,然后执行printf 函数打印i 的值。这就是典型的没明白什么是递归。

其实很简单,printf("%dn",i);语句是fun 函数的一部分,肯定执行一次fun 函数,就要打印一行。怎么可能只打印一次呢?关键就是不明白怎么展开递归函数。

展开过程如下:void fun(int i){ if (i>0) { //fun(i/2); if(i/2>0) { if(i/4>0) { … } printf("%dn",i/4); } printf("%dn",i/2); } printf("%dn",i);}这样一展开,是不是清晰多了?其实递归本身并没有什么难处,关键是其展开过程别弄错了。二、不使用任何变量编写strlen 函数看到这里,也许有人会说,strlen 函数这么简单,有什么好讨论的。

是的,我相信你能熟练应用这个函数,也相信你能轻易的写出这个函数。但是如果我把要求提高一些呢:不允许调用库函数,也不允许使用任何全局或局部变量编写intmy_strlen (char *strDest);似乎问题就没有那么简单了吧?这个问题曾经在网络上讨论的比较热烈,我几乎是全程“观战”,差点也忍不住手痒了。

不过因为我的解决办法在我看到帖子时已经有人提出了,所以作罢。解决这个问题的办法由好几种,比如嵌套有编语言。

因为嵌套汇编一般只在嵌入式底层开发中用到,所以本书就不打算讨论C 语言嵌套汇编的知识了。有兴趣的读者,可以查找相关资料。

也许有的读者想到了用递归函数来解决这个问题。是的,你应该想得到,因为我把这个问题放在讲解函数递归的时候讨论。

既然已经有了思路,这个问题就很简单了。代码如下:intmy_strlen( const char* strDest ){ assert(NULL != strDest); if ('' == *strDest) { return 0; } else { return (1 + my_strlen(++strDest)); }}第一步:用assert 宏做入口校验。

第二步:确定参数传递过来的地址上的内存存储的是否为''。如果是,表明这是一个空字符串,或者是字符串的结束标志。

第三步:如果参数传递过来的地址上的内存不为'',则说明这个地址上的内存上存储的是一个字符。既然这个地址上存储了一个字符,那就计数为1,然后将地址加1 个char类型元素的大小,然后再调用函数本身。

如此循环,当地址加到字符串的结束标志符''时,递归停止。当然,同样是利用递归,还有人写出了更加简洁的代码:intmy_strlen( const char* strDest ){ return *strDest?1+strlen(strDest+1):0;}这里很巧妙的利用了问号表达式,但是没有做参数入口校验,同时用*strDest 来代替(''== *strDest)也不是很好。

所以,这种写法虽然很简洁,但不符合我们前面所讲的编码规范。可以改写一下:intmy_strlen( const char* strDest ){ assert(NULL != strDest); return ('' != *strDest)?(1+my_strlen(strDest+1)):0;}上面的问题利用函数递归的特性就轻易的搞定了,也就是说每调用一遍my_strlen 函数,其实只判断了一个字节上的内容。

但是,如果传入的字符串很长的话,就需要连续多次函数调用,而函数调用的开销比循环来说要大得多,所以,递归的效率很低,递归的深度太大甚至可能出现错误(比如栈溢出)。所以,平时写代码,不到万不得已,尽量不要用递归。

即便是要用递归,也要注意递归的层次不要太深,防止出现栈溢出的错误;同时递归的停止条件一定要正确,否则,递归可能没完没了。

9.c语言里递归函数怎么用啊

奉上pascal汉诺塔程序代码,我没有学C。

只学了pascal。

目前在深入学习算法。

汉诺塔是个很典型的递归,是考验程序员的归纳能力的 [*]program hannuota;//汉诺塔游戏[*]var[*]panzi :integer;[*]procedure move(n,a,b,c : integer);[*]begin[*]if n = 1 then[*]write(a,' to ',c)[*]else begin[*]move(n-1,a,b,c);[*]writeln(a,' to ',c);[*]move(n-1,b,a,c);[*]end;[*]end;[*]begin[*]writeln('please write a number of the number of panzi');[*]read(panzi);[*]move(panzi,1,2,3);[*]readln;[*]readln;end.。

TAG标签:#递归函数 #语言 #