问题描述

算法训练-递归求二项式系数值-Java_算法训练


样例输入


一个满足题目要求的输入范例。


3 10


样例输出


与上面的样例输入对应的输出。


算法训练-递归求二项式系数值-Java_递归_02


数据规模和约定


  输入数据中每一个数的范围。


  例:结果在int表示时不会溢出。



代码演示

import java.util.Scanner;

/**
* 输入3,10 输出120
* 即:10*9*8/3/2/1 = 120
*
* @author Clearlight
*
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
int n = sc.nextInt();

System.out.println(f(k,n));
}

public static int f(int k, int n) {

if(k==0 || k==n) {
return 1;
}

return f(k,n-1) + f(k-1,n-1);
}

}



代码分析

在写这道题时,之前看了几节关于递归的讲解,写起来很简单。
根据给的提示的那张图片便可以根据它来写出递归的公式以及条件。

思路:

找重复:C(k,n)=C(k,n-1)+C(k-1,n-1),求C(k,n-1)和C(k-1,n-1)是原问题的重复(规模更小)-子问题
找变化:变化的量应该作为参数(k和n一直在变化)
找边界:出口(k=0或k=n)

根据这三个条件即可写出一个完整的递归.

另外,几个关于递归的练习,可以看看:

​​递归的实例-Java​​