首页技术递归算法经典题目c语言 递归算法1加到100

递归算法经典题目c语言 递归算法1加到100

编程之家2026-06-221003次浏览

大家好,今天给各位分享递归算法经典题目c语言的一些知识,其中也会对递归算法1加到100进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!

递归算法经典题目c语言 递归算法1加到100

C语言递归算法

递归具体用法其实就是让你把一个问题分解成很多个类似的情况,虽然你要解决这个问题非常难,莫名其妙,要你想几年,但是把他一直递归分解,就变成很好理解的单种情况,而你整个问题又是跟这个单种情况类似,把整个问题通过递归调用一层一层分解到最低级简单的那种情况,就是你所需要理解的了。

一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。C语言允许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。

(引自谭浩强的C语言书里)

用递归法计算n!可用下述公式表示:

n!=1(n=0,1)

n×(n-1)!(n>1)

递归算法经典题目c语言 递归算法1加到100

具体如下long ff(int n)

{

long f;

if(n<0) printf("n<0,input error");

else if(n==0||n==1) f=1;

else f=ff(n-1)*n;

递归算法经典题目c语言 递归算法1加到100

return(f);

}

main()

{

int n;

long y;

printf("\ninput a inteager number:\n");

scanf("%d",&n);

y=ff(n);

printf("%d!=%ld",n,y);

}

较难题:一块板上有三根针,A,B,C。A针上套有64个大小不等的圆盘,大的在下,小的在上。如图5.4所示。要把这64个圆盘从A针移动C针上,每次只能移动一个圆盘,移动可以借助B针进行。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。求移动的步骤。

具体如下move(int n,int x,int y,int z)

{

if(n==1)

printf("%c-->%c\n",x,z);

else

{

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

printf("%c-->%c\n",x,z);

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

}

}

main()

{

int h;

printf("\ninput number:\n");

scanf("%d",&h);

printf("the step to moving%2d diskes:\n",h);

move(h,'a','b','c');

}

从程序中可以看出,move函数是一个递归函数,它有四个形参n,x,y,z。n表示圆盘数,x,y,z分别表示三根针。move函数的功能是把x上的n个圆盘移动到z上。当n==1时,直接把x上的圆盘移至z上,输出x→z。如n!=1则分为三步:递归调用move函数,把n-1个圆盘从x移到y;输出x→z;递归调用move函数,把n-1个圆盘从y移到z。在递归调用过程中n=n-1,故n的值逐次递减,最后n=1时,终止递归,逐层返回。当n=4时程序运行的结果为:

C语言用递归算法求解下面这个题!!!求大神

以下是使用递归算法实现上述程序的C语言代码:

#include<stdio.h>

float sum(int n){

if(n== 0){//基本情况

return 0;

} else{

float s= 0;

for(int i= 1; i<= n; i++){//计算1/1+2+3+...+n

s+= i;

}

return sum(n-1)+ 1/s;//递归调用

}

}

int main(){

int n;

printf("请输入n的值:");

scanf("%d",&n);

printf("sum=%.2f\n", sum(n));

return 0;

}

在这个递归函数中,我们使用了一个基本情况,即当n等于0时,返回0作为递归的终止条件。在其他情况下,我们使用for循环计算1/1+2+3+...+n的值,然后通过递归调用求解sum(n-1),最后将两个结果相加。

二叉树先序非递归遍历C语言算法

#include"stdio.h"

#include"stdlib.h"

#define STACK_INIT_SIZE 10//栈的初始长度

#define STACKINCREMENT 5//栈的追加长度

typedef struct bitree{

char data;

struct bitree*lchild,*rchild;

}bitree;//二叉树结点定义

typedef struct{

bitree**base;

bitree**top;

int stacksize;

}sqstack;//链栈结点定义top栈顶 base栈底且栈元素是指向二叉树结点的二级指针

//建立一个空栈

int initstack(sqstack*s)

{s->base=(bitree*)malloc(STACK_INIT_SIZE*sizeof(bitree));//栈底指向开辟空间

if(!s->base) exit(1);//抛出异常

s->top=s->base;//栈顶=栈尾表示栈空

s->stacksize=STACK_INIT_SIZE;//栈长度为开辟空间大小

return 1;

}

//进栈

int push(sqstack*s,bitree*e)

{if(s->top-s->base>=s->stacksize)//如果栈满追加开辟空间

{s->base=(bitree*)realloc(s->base,(s->stacksize+STACKINCREMENT)* sizeof(bitree));

if(!s->base) exit(1);//抛出异常

s->top=s->base+s->stacksize;//感觉这一句没用

s->stacksize+=STACKINCREMENT;}

*(s->top)=e;s->top++;//进栈栈顶后移

return 1;

}

//出栈

int pop(sqstack*s,bitree**e)

{if(s->top==s->base) return 0;//栈空返回0

--s->top;*e=*(s->top);//栈顶前移取出栈顶元素给e

return 1;}

//取栈顶

int gettop(sqstack*s,bitree**e)//去栈顶元素注意top指向的是栈顶的后一个

{if(s->top==s->base) return 0;//所以 s->top-1

*e=*(s->top-1);

return 1;

}

/*------------------------非递归-----先序建立二叉树----------------------------------*/

bitree*createprebitree()

{char ch;bitree*ht,*p,*q;

sqstack*s;

s=malloc(sizeof(bitree));//加上这一句为s初始化开辟空间

ch=getchar();

if(ch!='#'&&ch!='\n')/*输入二叉树先序顺序是以完全二叉树的先序顺序

不是完全二叉树的把没有的结点以#表示*/

{ht=(bitree*)malloc(sizeof(bitree));

ht->data=ch;

ht->lchild=ht->rchild=NULL;

p=ht;

initstack(s);

push(s,ht);//根节点进栈

while((ch=getchar())!='\n')//算

{if(ch!='#'){q=(bitree*)malloc(sizeof(bitree));//法

q->data=ch;//

if(p==*(s->top-1)) p->lchild=q;//核

else p->rchild=q;//

push(s,q);p=q;//心

}//

else{if(p==*(s->top-1)) p->lchild=NULL;//的

else p->rchild=NULL;//

pop(s,&p);}//步

//

}//骤

return ht;

}

else return NULL;

}

/*--------------------------递归---------先序建立二叉树-------------------------------*/

void CreateBiTree(bitree**T){

//按先序次序输入二叉树中的结点的值(一个字符),空格字符表示空树,

//构造二叉链表表示二叉树

char ch;

scanf("%c",&ch);

if(ch=='#')*T=NULL;

else{

*T=(bitree*)malloc(sizeof(bitree));

if(!*T) exit(1);

(*T)->data=ch;//生成根结点

CreateBiTree(&(*T)->lchild);//构造左子树

CreateBiTree(&(*T)->rchild);//构造右子树

}

}

/*--------------------------非递归-------中序建立二叉树-------------------------------*/

/*--------------------------递归---------中序建立二叉树-------------------------------*/

/*--------------------------非递归-------后序建立二叉树-------------------------------*/

/*--------------------------递归---------后序建立二叉树-------------------------------*/

/*-----------------------非递归------先序输出二叉树------------------------------*/

void preordertraverse(bitree*h)

{sqstack m;

initstack(&m);

while(h||m.base!=m.top)

{if(h){push(&m,h);printf("%c",h->data);h=h->lchild;}

else{pop(&m,&h);

h=h->rchild;}

}

}

/*------------------------非递归-----中序输出二叉树----------------------------*/

void inordertraverse(bitree*h)

{sqstack m;

initstack(&m);

while(h||m.base!=m.top)

{if(h){push(&m,h);h=h->lchild;}

else{

pop(&m,&h);

printf("%c",h->data);

h=h->rchild;

}

}

}

/*---------------------非递归----后序遍历二叉树----------------------------------*/

void postordertraverse(bitree*h)

{

sqstack m;

initstack(&m);

while(h||m.base!=m.top)

{if(h){

push(&m,h);

h=h->lchild;}

else{

bitree*r;//使用r结点表示访问了右子树代替标志域

gettop(&m,&h);

if(h->rchild&&h->rchild!=r)

{h=h->rchild;

push(&m,h);

h=h->lchild;}

else{pop(&m,&h);

printf("%c",h->data);

r=h;h=NULL;}

}

}

}

//层次遍历二叉树用队列哈哈以后做

/*-------------------------------主过程-------------------------------*/

int main()

{bitree*ht;

printf("先序非递归建立一个二叉树:");

if((ht=createprebitree())!=NULL)//非递归建立

//CreateBiTree(&ht);

//if(ht!=NULL)//递归建立

{

printf("先序遍历输出二叉树:");

preordertraverse(ht);

putchar('\n');

printf("中序遍历输出二叉树:");

inordertraverse(ht);

putchar('\n');

printf("后序遍历输出二叉树:");

postordertraverse(ht);

putchar('\n');

}

else printf("空二叉树\n");

}

关于递归算法经典题目c语言和递归算法1加到100的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

ai出题软件(能够ai出题的软件)百度ai智能翻译(百度怎么在线翻译)