递归算法经典题目c语言 递归算法1加到100
大家好,今天给各位分享递归算法经典题目c语言的一些知识,其中也会对递归算法1加到100进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
C语言递归算法
递归具体用法其实就是让你把一个问题分解成很多个类似的情况,虽然你要解决这个问题非常难,莫名其妙,要你想几年,但是把他一直递归分解,就变成很好理解的单种情况,而你整个问题又是跟这个单种情况类似,把整个问题通过递归调用一层一层分解到最低级简单的那种情况,就是你所需要理解的了。
一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。C语言允许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。
(引自谭浩强的C语言书里)
用递归法计算n!可用下述公式表示:
n!=1(n=0,1)
n×(n-1)!(n>1)
具体如下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;
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的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。