C++递归

递归说的是方法自身对自身的调用方式

比如递归的阶乘

#include"stdio.h"
int dg(int n);
void main(){
	int n;
	printf("输入n\n");
	scanf("%d",&n);
	printf("%d的阶乘为%d",n,dg(n)); 
} 
int dg(int n){//递归的函数 
	if(n==1){//一直调用直到到达递归边界,也就是最后一个明确值 
		return 1;
	}
	else{//一直递归如果前一个问题还是未知的就在此调用 
		return dg(n-1)*n;
	}
}

其他的还有很多,我也容纳在了一个程序里面大家可以看一下

/* Note:Your choice is C IDE */
#include "stdio.h"
int jishu1=0;
int fun1(int n);
int fun2(int n);
int fun3(int n);
int fun4(int n);
int fun5(int n,int k);
void fun6(char a[100],int n);//参数是一个数组和一个数组实际长度
int fun7(int n);
void fun8(int a[100],int k);
void main()
{
	int bh;
	int start,end;
	int i,sum=0;
	int jishu=0;
	int m;//盘子个数
	int n,k;
	char a[100];
	int c;
	int b[100];
    for(;;)
    {
    	printf("\n\t\t递归专项训练\n");
    	printf("\t\t1.计算阶乘和\n");
    	printf("\t\t2.斐波那契数列\n");
    	printf("\t\t3.爱因斯坦台阶\n");
    	printf("\t\t4.汉诺塔移动\n");
    	printf("\t\t5.计算n的k次方\n");
    	printf("\t\t6.递归倒序输出字符串\n");
    	printf("\t\t7.递归计算数字之和\n");
    	printf("\t\t8.递归顺序输出数字\n");
    	printf("\t\t0.退出\n");
    	printf("请输入编号:");
    	scanf("%d",&bh);
    	switch(bh)
    	{
    		case 1:
    		printf("请输入起始值:");
    		scanf("%d",&start);
    		printf("请输入终止值:");
    		scanf("%d",&end);
    		for(i=start;i<=end;i++)
    		{
    			printf("%d的阶乘是%d\n",i,fun1(i));
    			sum=sum+fun1(i);//求和
    		} 
    		printf("%d~%d的阶乘结果和是%d",start,end,sum);
    		break;
    		case 2:
    		for(i=1;i<=20;i++)
    		{
    			printf("%d\t",fun2(i));
    			jishu++;
    			if(jishu%5==0)//每五个一换行
    			{
    				printf("\n");
    			}
    		} 
    		break;
    		case 3:
    		for(i=1;i<=10;i++)
    		{
    			printf("第%d个额台阶有%d个登法\n",i,fun3(i));
    		}
    		break;
    		case 4:
    		//2^n-1
    		printf("输入盘子的个数:");
    		scanf("%d",&m);
    		printf("至少需要移动%d次\n",fun4(m));
    		break;
    		case 5: 
    		printf("请输入n和k的值:");
    		scanf("%d%d",&n,&k);
    		printf("%d的%d次方是%d\n",n,k,fun5(n,k));
    		break;
    		case 6: 
    		printf("输入一个字符串:");
    		scanf("%s",a);
    		fun6(a,strlen(a)-1);
    		break;
    		case 7: 
    		printf("请输入一个整数:");
    		scanf("%d",&c);
    		printf("和是%d",fun7(c));
    		break;
    		case 8:
    		printf("请输入一个整数:");
    		scanf("%d",&m);
    		fun8(a,m); 
    		for(i=jishu1-1;i>=0;i--)
    		{
    			printf("%d\t",b[i]);
    		}
    		break;
    		case 0:exit(0);
    		default:printf("输入有误!\n");
    	}
    	
    }
}
int fun1(int n)
{
	if(n==1)//边界条件
	{
		return 1;
	}
	else
	{
		return fun1(n-1)*n;//阶乘递归表达式
	}
}

int fun2(int n)
{
	if(n==1 || n==2)
	{
		return 1;
	}
	else
	{
		return fun2(n-1)+fun2(n-2);//斐波那契的递归表达式
	}
}
int fun3(int n)
{
	if(n==1)
	{
		return 1;
	}
	else if(n==2)
	{
		return 2;
	}
	else
	{
		return fun3(n-1)+fun3(n-2);//阶梯登法的递归表达式
	}
}
int fun4(int n)
{
	if(n==1)
	{
		return 1;
	}
	else
	{
		return 2*fun4(n-1)+1;//汉诺塔的递归表达式
	}
}
int fun5(int n,int k)
{
	if(k==1)
	{
		return n;
	}
	else
	{
		return fun5(n,k-1)*n;//n的k次幂的递归表达式
	}
}

void fun6(char a[100],int n)
{
	if(n==0)//下标为0
	{
		printf("%c",a[n]);
	}
	else
	{
		printf("%c",a[n]);
		n--;
		fun6(a,n);//调用自身
	}
}
int fun7(int n)
{
	int sum=0;
	if(n==0)
	{
		return 0;
	}
	else
	{
		sum=sum+n%10;
		n=n/10;
		
		return sum+fun7(n);//递归表达式
		
	}
}
void fun8(int a[100],int k)
{
	if(k!=0)
	{
		a[jishu1]=k%10;
		k=k/10;
		jishu1++;
		fun8(a,k);
	}
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值