递归算法题

递归算法题

本文章将对一些常见的递归算法进行解析,并给出一些思路提供给大家。博主使用的语言为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;
	}

    原文作者:递归算法
    原文地址: https://blog.csdn.net/qq_23994787/article/details/78170398
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞