递归算法题
本文章将对一些常见的递归算法进行解析,并给出一些思路提供给大家。博主使用的语言为java。
1. 求1+2+3+……+n的值
static int fun1(int n){
if (n == 1)
return 1;
return n + fun1(n-1);
}
2.求1*2*3*……*n的值
static int fun2(int n){
if (n == 1)
return 1;
return n * fun2(n-1);
}
3.小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一半,又多吃一个.以后每天早上吃前一天剩下的一半另一个.到第10天早上猴子想再吃时发现,只剩下一个桃子了.问第一天猴子共摘多少个桃子?
static int fun3(int day){
if (day == 1) return 1;
return 2*(fun3(day-1) + 1);
}
4.有雌雄一对兔子,假定过两个月便可繁殖雌雄各一的一对小兔子。问过n个月后共有多少对兔子?
static int fun4(int n){ //其实就是斐波那契数,从第三项开始每一项都是前两项和 1 1 2 3 5 8 13 21.....
if(n == 1)
return 1;
if(n == 2)
return 1;
return fun4(n - 1) + fun4(n - 2);
}
5.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
static int fun5(int pos){
if (pos == 1)
return 2;
return 2*(fun5(pos-1) + 1);
}
6.求两个数的最大公约数。
static int fun6(int n, int r){
int temp = n%r;
if (temp == 0){
return r;
}
else {
n = r;
r = temp;
fun6(n, r);
}
return -1;
}
7.求两个数的最小公倍数。
static int fun7(int s,int m,int n){
if (s%n==0){
return s;
}else{
return fun7(s+m,m,n);
}
}
8.输入一个数字n 如果n为偶数则除以2,若为奇数则加1或者减1,直到n为1,求最少次数 写出一个函数。
static int fun8(long n) {
if(n<=1) {
return 0;
}
if((n&1) == 0) {
return fun8(n/2) + 1;
}else{
return Math.min(fun8( (n-1)/2 ), fun8( (n+1)/2) ) + 2;
}
}
9. 将十进制转换为二进制。
static void fun9(int n){
int temp = n;
if (n == 1) {
System.out.print(n%2);
}
else {
fun9(n/2);
System.out.print(temp%2);
}
}
10.梯有N阶,上楼可以一步上一阶,也可以一次上二阶。编一个程序,计算共有多少种不同的走法。
IF (N == 1) RETURN 1;
IF (N == 2) RETURN 2;
RETURN F(N – 1) + F(N – 2);
public static long fun(int s) {
if (s == 0 || s == 1)
return 1;
else
return fun(s - 1) + fun(s - 2);
}
11. 某人写了n封信和n个信封,如果所有的信都装错了信封。求所有的信都装错信封共有多少种不同情况?
分析:
1、当N=1和2时,易得解~,假设F(N-1)和F(N-2)已经得到,重点分析下面的情况:2、当有N封信的时候,前面N-1封信可以有N-1或者 N-2封错装
3、前者,对于每种错装,可从N-1封信中任意取一封和第N封错装,故=F(N-1)*(N-1)
4、后者简单,只能是没装错的那封和第N封交换信封,没装错的那封可以是前面N-1封中的任意一个,故= F(N-2) * (N-1)
得到如下递推公式:
基本形式:d[1]=0; d[2]=1
递归式:d[n]= (n-1)*( d[n-1] + d[n-2])
public static long fun(int s) {
if (s == 0 || s == 1)
return 1;
else
return (s-1)*( fun(s - 1) + fun(s - 2) );
}
12.一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能行有多少种?
static long fun12(int n, int sum){
if ((n == 1 && sum <= 10) || (sum == n * 10))
return 1;
if (sum > n * 10 || sum < 0)
return 0;
long x = 0;
for (int i = 0; i <= 10; i++){
x += fun12(n - 1, sum - i);
}
return x;
}
13.一个整数,大于0,不用循环和本地变量,按照 n, 2n, 4n, 8n 的顺序递增,当值大于5000 时,把值按照指定顺序输出来。
public static void fun13(int n) {
System.out.println(n);
if (n <= 5000) {
n*=2;
fun13(n);
n/=2;
}
System.out.println(n);
}
14.第1个人10,第2个比第1个人大2岁,依次递推,请用递归方式计算出第8个人多大?
public static int fun14(int n){
if(n==1)
return 10;
return fun14(n-1) + 2;
}