递归问题现在一直有些不理解……
遇到的题记录下来
1:递归算法的思想
递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。在C语言中的运行堆栈为他的存在提供了很好的支持,过程一般是通过函数或子过程来实现。
递归算法:在函数或子过程的内部,直接或者间接地调用自己的算法。2:递归算法的特点:
递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:
(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。3:递归算法的要求
递归算法所体现的“重复”一般有三个要求:
一是每次调用在规模上都有所缩小(通常是减半);
二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);
三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。
生小兔子问题
有一对小兔子,从出生后第3个月起每个月都生一对兔子。
小兔子长到第3个月后每个月又生一对兔子。按此规律,
假设没有兔子死亡,第一个月有一对刚出生的小兔子,
问第n个月有多少对兔子?
经过推算发现是Fibonaci(斐波那契)数列:1,1,2,3,5,8,13,21,34,55,89,144,…… 从第三项起都是前两项的和
然后可以写了
hduoj2018
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
前4年只有母牛在生所以是+1,第五年多了头母牛就是+3,然后可以倒着想第n年的牛是由前一年所有的牛和今年新生的牛组成的,今年能生的一定是4年前的牛即n-3年的牛。
#include<iostream>
using namespace std;
int run(int a)
{
if(a<4)
return a;
else
return run(a-1)+run(a-3);
}
int main()
{
int a,b;
while(cin>>a ,a!=0)
{
b = run(a);
cout<<b<<endl;
}
}
十进制转化二进制
给一个十进制的数转化为二进制的数
从最后一位起倒叙输出2的余数
hduoj2051
Give you a number on base ten,you should output it on base two.(0 < n < 1000)
#include<iostream>
using namespace std;
void run(int a)
{
if(a==0)
return ;
else
run(a/2);
cout<<a%2;
}
int main()
{
int a;
while(cin>>a)
{
run(a);
cout<<endl;
}
}
最大公约数
实际就是欧几里德算法,辗转相除法,定理:两个整数的最大公约数等于其中较小的那个数和两数的和相除余数为最大公约数。最大公约数(greatest common divisor)缩写为gcd。
#include<iostream>
using namespace std;
int gcd(int a,int b)
{
if(a%b==0)
return b;
else
gcd(b,a%b);
}
int main()
{
int a,b;
while(cin>>a>>b)
{
cout<<gcd(a,b);
}
}