递归与非递归算法

一、题目分析

  1. 将非负十进制整n转换成b进制(其中b = 2~16)
  2. 将任意正整数n用2的幂次方表示

二、算法设计

1、转换进制问题:exer.cpp

递归算法

递归出口:n / b < b

递归表达式:f(n,b)=f(n/b,b)    (n/b>=b)

 递归栈表示;

2、用二的幂次方表示任意正整数n问题:exer2.cpp

递归算法

递归出口:f(n)=1或f(n)=0或f(n)=2

递归表达式:f(n)=f(logn/log2)+f(n-pow(2,logn/log2)) (logn/log2>2)

递归栈表示:

三、源代码

1、数值转换问题

递归:

#include <iostream>
using namespace std;
void NumSystemConversion(int a,int b)
{
    char str[] = {"0123456789ABCDEF"};
    if(a / b >= b)
    {
        NumSystemConversion(a / b,b);
    }
    else{
        cout << str[a / b];
    }
    cout << str[a % b];
    
}

void main() {
	int n,b;
	cout << "请输入任意非负十进制整数:";
	cin >> n;
	cout << "请输入想要转换的数制:";
	cin >> b;
	cout << "转换后的结果为:";
	NumSystemConversion(n,b);
	cout << endl;
}

非递归:

#include <iostream>
using namespace std;
void main()
{
	int n,b;
	char str[] = {"0123456789ABCDEF"};
	char temp[10];
	cout << "请输入任意非负十进制整数:";
	cin >> n;
	cout << "请输入想要转换的数制:";
	cin >> b;
	cout << "转换后的结果为:";
	int i =0;
	bool bl = true;
	while(bl)
	{
		if(n / b >= b)
		{
			temp[i] = str[n % b];
			n = n / b;
			i++;
		}
		else
		{
			cout << str[n / b];
			cout << str[n % b];
			bl = false;
		}
	}
	while(i-- > 0)
	{
		cout << temp[i];
	}
	cout << endl;
}

2.用2的幂次方表示任意正整数问题

递归;

#include <stdio.h>
#include <math.h>
void conversion(int n);

void main()
{	
	int n;	
	printf("请输入任意正整数:");
	scanf("%d",&n);	
	printf("转换后输出:");
	conversion(n);	
	printf("\n");
}

void conversion(int n)
{	
	int y,temp;	
	y = log(n) / log(2);	
	if(y > 2)
	{		
		printf("2(");		
		conversion(y);		
		printf(")");
	}
	else if(y == 1)
	{		
		printf("2"); 	
	}
	else
	{		
		printf("2(%d)",y); 	
	}	
	temp = n - pow(2,y);	
	if(temp > 0)
	{		
		printf("+");		
		conversion(temp);	
	}
}

四、运行结果

1、

2、

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值