递归与分治

前言

递归到天荒地老

正文

递归过程摸索

#include<iostream>
using namespace std;
int fun(int n)
{
	if (n > 5)
	{
		return n;
	}
	else
	{
		cout << "leval 1th-n" <<" "<<n << endl;
		int result = fun(n + 1);
		cout<< "leval 2th-n" << " " << n << endl;
		cout << "leval 2th-result" << " " << result << endl;
		return n;
	}
}
int main()
{
	int key = fun(0);
	cout << "main key" << " " << key << endl;
	system("pause");
	return 0;
}

青蛙跳台阶

题目描述

 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

输入
多组测试样例。每组测试样例包含一个整数n。(1<=n<=100)

输出
每组测试样例输出一行,表示青蛙跳上n级台阶的跳法数量.
所得到的结果模1000000007

样例输入

3
4

样例输出

3
5

解题思路
斐波那契数列,此题递归时间太长,不推荐,最好的方法是迭代
code

#include<iostream>
using namespace std;
unsigned long long fab(unsigned int num)
{
	unsigned long long a = 1000000007;
	unsigned long long form1 = 1;
	unsigned long long form2 = 2;
	unsigned long long target = 0;
	if (num == 1)
	{
		return 1;
	}
	else if (num == 2)
	{
		return 2;
	}
	else
	{
		for (int i = 3; i <= num; i++)
		{
			target=((form1%a)+(form2%a))%a;
			form1=form2;
			form2=target;
		}
		return target;
	}
}
int main()
{
	
	unsigned int n;
	while(cin >> n)
	{
		cout <<fab(n)<< endl;
	}
	return 0;
}

排列问题

题目描述
要求输入一个字符串,输出他的全排列
code

#include<iostream>
#include<string.h>
using namespace std;
char list[2000];
void swap(int a,int b) 
{
	int temp=a;
	a=b;
	b=temp;
}
void perm(int k,int m)//输出list数组从k到m位的全排列
{ 
	if(k==m)
	{
		for(int i=0;i<=m;i++)cout<<list[i];
		cout<<endl;
		return;
	}//递归到k=m为止结束递归
	else
	{
		for(int i=k;i<=m;i++)
		{
			swap(list[k],list[i]);
			perm(k+1,m);
			swap(list[k],list[i]);
		}
	}
}
int main()
{
	while(cin>>list)
	{
		int len=strlen(list);
		perm(0,len-1);
	}
} 

汽水瓶

题目描述

有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?

输入
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1≤n≤100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。

输出
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出 0

样例输入
3
10
81
0

样例输出
1
5
40

code

#include<iostream>
using namespace std;
int bottle(int n)
{
	int count=0;
	while(n>=3)
	{
		int form1=n/3;
		int form2=n%3;
		n=form1+form2;
		count+=form1;
		if(n==2)
		{
			count++;
			break;
		}
	}
	return count;
}
int main()
{
	int N;
	while(cin>>N&&N!=0)
	{
		int ans=bottle(N);
		cout<<ans<<endl;
	}
	return 0;
}

进制转换

题目描述

 输入一个十进制正整数,然后输出它所对应的八进制数。

输入
输入一个十进制正整数n(1≤n≤106) 。

输出
输出n对应的八进制数,输出在一行。

样例输入
10

样例输出
12

code

#include<iostream>
using namespace std;
int form(int num)
{
	if (num <8)
	{
		return num;
	}
	else 
	{
		return num % 8 + 10 * form(num / 8);
	}
}
int main()
{
	int a,b;
	cin >> a;
	b = form(a);
	cout << b << endl;
	return 0;
}

二分法

题目描述

在金融中,我们有时会用内部收益率IRR来评价项目的投资财务效益,它等于使得投资净现值NPV等于0的贴现率。换句话说,给定项目的期数T、初始现金流CF0和项目各期的现金流CF1, CF2, ...,CFT,IRR是下面方程的解:

为了简单起见,本题假定:除了项目启动时有一笔投入(即初始现金流CF0 < 0)之外,其余各期均能赚钱(即对于所有i=1,2,...,T,CFi > 0)。根据定义,IRR可以是负数,但不能大于-1。

输入

输入文件最多包含25组测试数据,每个数据占两行,第一行包含一个正整数T(1<=T<=10),表示项目的期数。第二行包含T+1个整数:CF0, CF1, CF2, ..., CFT,其中CF0 < 0, 0 < CFi < 10000 (i=1,2,...,T)。T=0表示输入结束,你的程序不应当处理这一行。

输出

对于每组数据,输出仅一行,即项目的IRR,四舍五入保留小数点后两位。如果IRR不存在,输出"No",如果有多个不同IRR满足条件,输出"Too many"(均不含引号)

样例输入

1

-1 2

2

-8 6 9

0

样例输出

1.00

0.50

思路
从无穷大到-1二分搜索答案

code

#include <iostream>
#include <iomanip>
#include <cmath> 
using namespace std;
int main()
{
	int t,i;
	while(cin>>t&&t!=0)
	{
	    double a[11];
	    for(i=0;i<=t;i++)
    	    cin>>a[i];
    	    double l,r,mid,x,ans;
	    	ans=0.0;
    	    l=-1.0;
    	    r=1e6;
    	    while(fabs(a[0]+ans)>1e-7)
    	   {
    		ans=0.0;
    		x=1.0;
    		mid=(l+r)/2;
    		for(int j=1;j<=t;j++)
    		{
    			x=x/(1+mid);
    			ans+=a[j]*x;
			} 
			if((ans+a[0])>0)
				l=mid;
			else r=mid;
	       }
	    cout<<fixed<<setprecision(2)<<mid<<endl;
	}
	return 0; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值