递归程序设计2(C语言)

这篇博客探讨了如何使用递归方法将非负十进制整数转换为2到16进制,并展示了如何将正整数表示为2的幂次方组合。通过两个具体的编程题目,详细阐述了递归模型和递归栈的概念,提供了递归和非递归的代码实现,并给出了样例输入输出。在实践中,作者深化了对递归的理解,认为递归能有效简化问题,是解决复杂问题的有效工具。
摘要由CSDN通过智能技术生成
  1. 实验内容
    题目1:将非负十进制整数n转换成b进制。(其中b=2~16)
    题目2:任何一个正整数都可以用2的幂次方表示。例如:
        137=27+23+2^0    
    同时约定幂次方用括号来表示,即ab 可表示为a(b)。
       由此可知,137可表示为:
         2(7)+2(3)+2(0)
    进一步:7= 22+2+20 (21用2表示)
         3=2+2^0
    所以最后137可表示为:
         2(2(2)+2+2(0))+2(2+2(0))+2(0)
       又如:
         1315=2^10 +2^8 +2^5 +2+2^0
    所以1315最后可表示为:
       2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
      输入:正整数(n≤20000)
    输出:符合约定的n的0,2表示(在表示中不能有空格)
    输入格式 Input Format
    一个正整数
    输出格式 Output Format
    符合约定的n的0,2表示(在表示中不能有空格)
    样例输入 Sample Input
    73
    样例输出 Sample Output
    2(2(2)+2)+2(2+2(0))+2(0)
  2. 递归模型
    在这里插入图片描述
  3. 递归栈
    题目一:

在这里插入图片描述
4. 代码实现
1.题目一:
(1)递归实现:

#include <stdio.h>
#define N 100
char a[N]={'\0'}; 
int i=0;
void ChangeNum(int n,int b)
{
	if(n==0){
		return;
	}	
	else{
		ChangeNum(n/b,b);
		if(n%b<10){
			a[i++]=n%b+48; //在字符数组中存入ASCII码表中数字所代表的字符,如数字48代表字符'0' 
		}
		else{
			a[i++]=n%b+55;//在字符数组中存入ASCII码表中数字所代表的字符,如数字65代表字符'A' 
		}
	}
}
int main(void)
{
	int n,b;
	printf("请输入非负十进制整数:");
	scanf("%d",&n);
	printf("请输入数字即转换为多少进制数(b=2~16):");
	scanf("%d",&b);
	ChangeNum(n,b);
	for(int j=0;j<i;j++){
		printf("%c",a[j]);
	}
	return 0;
}

(2)非递归实现:

#include <stdio.h>
#define N 100
static char a[N]={'\0'};
static int i=0;
void ChangeNum(int n,int b)
{
	while(n){
		if(n%b<10){
			a[i++]=n%b+48; //在字符数组中存入ASCII码表中数字所代表的字符,如数字48代表字符'0' 
		}
		else{
			a[i++]=n%b+55;//在字符数组中存入ASCII码表中数字所代表的字符,如数字65代表字符'A' 
		}
		n=n/b; 
	}
}

int main(void)
{
	int n,b;
	printf("请输入非负十进制整数:");
	scanf("%d",&n);
	printf("请输入数字即转换为多少进制数(b=2~16):");
	scanf("%d",&b);
	ChangeNum(n,b);
	for(int j=i-1;j>-1;j--){
		printf("%c",a[j]);
	}
	printf("\n");
	return 0;	
}

2.题目二:
递归实现

#include <iostream> 
using namespace std; 
/*
//n为操作数,r为递归深度
void fun(int n, int r)
{
    //递归结束
    if (1 == n)
    {
        cout<<"2("<<r<<")";
    }
    else
    {
        //n除以二,递归深度加1
        fun(n/2, r+1);
        //如果模2有余数,则为2^r
        if (1 == n%2)
        {
            cout<<"+2("<<r<<")";
        }
    }
}
*/
//n为操作数,r为递归深度
void fun(int n, int r)
{
    //递归结束,最先输出,不带+号
    if (1 == n)
    {
        /*cout<<"2("<<r<<")";*/
        //将r表示成0和2
        switch(r)
        {
            //2^0,递归深度为0
        case 0:cout<<"2(0)";break;
            //2^1,递归深度为1
        case 1:cout<<"2";break;
            //2^2,递归深度为2
        case 2:cout<<"2(2)";break;
            //2^r,递归深度为r
        default:
            cout<<"2(";
            fun(r,0);
            cout<<")";
        }
    }
    else
    {
        //n除以二,递归深度加1
        fun(n/2, r+1);
        //如果模2有余数,则为2^r
        if (1 == n%2)
        {
            /*cout<<"+2("<<r<<")";*/
            /*cout<<"2("<<r<<")";*/
            //将r表示成0和2
            switch(r)
            {
                //2^0,递归深度为0
            case 0:cout<<"+2(0)";break;
                //2^1,递归深度为1
            case 1:cout<<"+2";break;
                //2^2,递归深度为2
            case 2:cout<<"+2(2)";break;
                //2^r,递归深度为r
            default:
                cout<<"+2(";
                fun(r,0);
                cout<<")";
            }
        }
    }
}
int main(void)
{
	int num;
	cout<<"请输入一个正整数:"<<endl;
	cin>>num;
	fun(num,0);
	return 0;
}

  1. 测试及运行结果
    题目一:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    题目二:
    在这里插入图片描述
    在这里插入图片描述
  2. 经验总结
    经过这次的程序设计,尤其是题目2,让我更加深刻地理解了递归的巧妙之处:化繁为简。让问题简单化,即先设计出一种解决方式,然后思考这种解决方式是否对所有情况通用,如果通用则用递归,那么问题就变得十分简单。虽然刚开始接触递归的时候,总是想不通为什么要这样写,但是慢慢地理解了递归,现在感觉递归不是很难了。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值