算法递归的详解

**

1,双小球问题

**
在一个袋子里有无数个红球(R)和蓝球(B),玩家需要选取n个小球,但是不能连续选取两个红球;而且需要考虑选取顺序:选取红蓝(RB)跟蓝红(BR)是两种不同的情况。问:有多少种不同的选取方法?

1. 确定问题参数
有n个小球,所以参数是n;
2. 使用参数表示解
我们使用f(n)为解来表示:在不能连续选取两个红球、虑选取顺序下有多少种选取方法;

3. 在解简单明了的情况下确定简单情景。

当袋子中有一个小球时,有R和B两种情况所以

 f(1=2;

当袋中有两个球时,那么就有RB、BR、BB三种情况所以

f(2=3;

4. 确定复杂情景与简单情景的关系
(1),当袋中小球个数为n的时候,有两种情况。要么第一个选中B,要么第一个选中R;
(2),如果第一个选中B;那么剩下的n-1个小球就有f(n-1)个可能;
(3),如果第一个选中R,那么与此同时,第二个小球只能是B,因此也只能有n-2个小球有f(n-2)种情况。
所以:

f(n)=f(n-1+f(n-2;

因此:

 f(n)=2;                         n=1
 f(n)=3;                         n=2
 f(n)=f(n-1+f(n-2;          n>2

完整代码如下

import java.util.Scanner;

/**
 * 在一个袋子里有无数个红球(R)和蓝球(B),玩家需要选取n个小球,
 * 但是不能连续选取两个红球;而且需要考虑选取顺序:选取红蓝(RB)跟蓝红(BR)是两种不同的情况。问:有多少种不同的选取方法?
 */
public class TwoColorBall {
    public static void main(String[] args) {
        System.out.print("请输入袋中小球的个数:");
        Scanner sc = new Scanner(System.in);
        long n = sc.nextLong();
        long x = fun(n);
        System.out.println(x);
    }

    public static long fun(long n) {
        if (n==1){
            return 2;
        }
        if (n == 2) {
            return 3;
        }
        else
            return fun(n-1)+fun(n-2);
    }
}

三色球问题

选取小球的问题有多种延伸版本,第一种就是考虑三种颜色的情况。仍然假设一个袋子里有无数个红球(R)、绿球(G)和蓝球(B),在不能连续选取两个红球的情况下选取小球;同样需要考虑选取顺序:选取红蓝(RB)跟蓝红(BR)是两种不同的情况。问:共有多少种选取n个小球的方法?

1. 确定问题参数
有n个小球,所以参数是n;
2. 使用参数表示解
我们使用f(n)为解来表示:在不能连续选取两个红球、虑选取顺序下有多少种选取方法;

3. 在解简单明了的情况下确定简单情景。

当袋子中有一个小球时,有红球R、绿球G和篮球B三种情况所以

 f(1= 3;

当袋中有两个球时,那么就有RB、BR、BB三种情况所以

f(2=8;

4. 确定复杂情景与简单情景的关系。
当有n个小球时:
(1)如果第一个小球是G,那么剩余的n-1个小球可以是任何小球颜色,有f(n-1)种情况

f(n) = n-1; 

(2)如果第一个小球是B,那么剩余的n-1个小球可以是任何小球颜色,有f(n-1)种情况

f(n) = n-1; 

(3),如果第一个小球是红色球R、那么第n-1个球就只能是绿球G或者篮球B

  1. 当第n-1个球为绿球G时,接下来的n-2个球没有颜色限制,可以是任何颜色,因此有f(n-2)种情况
f(n) = n-2; 
  1. 同理当第n-1个球为蓝球G时,接下来的n-2个球没有颜色限制,可以是任何颜色,因此也有f(n-2)种情况
f(n) = n-2; 

因此:

f(n) = 3                                            n=1
f(n) = 8                                            n=2
f(n)=f(n-1)+f(n-1)+f(n-2)+f(n-2)=2*(f(n-1)+f(n-2))  n>2 

代码如下:


import java.util.Scanner;

public class ThreeColorBall {
    public static void main(String[] args) {
        System.out.print("请输入袋中小球的个数:");
        Scanner sc = new Scanner(System.in);
        long n = sc.nextLong();
        System.out.println(fun(n));
    }

    public static long fun(long n) {
        if (n==1){
            return 3;
        }
        if (n == 2) {
            return 8;
        }
        else
            return 2*(fun(n-1)+fun(n-2));
    }
}

附加限制条件(难点)

这个问题也可以通过附加限制条件来延伸拓展。现在不能连续选取两个红球或两个绿球,但可以连续选取两个蓝球。问:共有多少种选取n个小球的方法?
其实这个问题可以通过分别来求解以此来解决问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值