任何循环都可以改为递归,关键是发现逻辑“相似性”和递归出口。
有些语言没有循环只有递归,如lisp和clojure。拓展尾递归。
数组求和
1 | package bluebridgecup; |
打印数组
1 | package bluebridgecup; |
字符串是否相同
1 | package bluebridgecup; |
求阶乘
1 | package bluebridgecup; |
求n个不同元素的全排列*
1 | package bluebridgecup; |
在n个求中,任意取出m个,求有多少种不同取法
1 | package bluebridgecup; |
求最长公共子序列的长度
1 | package bluebridgecup; |
翻转字符串
1 | package bluebridgecup; |
杨辉三角
1 | package bluebridgecup; |
m个a,n个b 可以有多少种组合
1 | package bluebridgecup; |
split 6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28package bluebridgecup;
public class A11_Split_6 {
public static void main(String[] args) {
int[] a = new int[100];//做缓冲
helper(3,a,0);
}
//对n进行加法划分
// a:缓冲
// k:当前的位置
private static void helper(int n,int[] a,int k) {
if (n <= 0){
for(int i=0;i < k;i++)System.out.printf(a[i] + " ");
System.out.println();
return;
}
//6
//5...f(1)
//4...f(2)
for (int i = n; i > 0; i--) {
if (k > 0 && i > a[k - 1])continue;//a[k - 1]表示前一项 ; 后一项 > 前一项
a[k] = i;
helper(n - i,a,k + 1);
}
}
}
ErrorSum
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31package bluebridgecup;
public class A12_ErrorSum {
public static void main(String[] args) {
int sum = 6;
int[] a = {3,2,4,3,1};
boolean[] b = new boolean[a.length];//表示a对应项是否选取
helper(sum,a,0,0,b);
}
//error_sum:有错误的和
//a:明细
//k:当前处理的位置
//cur_sum:前边元素的累加和
//b:记录取舍
private static void helper(int error_sum, int[] a, int k, int cur_sum, boolean[] b) {
if (cur_sum > error_sum)return;
if (error_sum == cur_sum){
for(int i = 0;i < b.length;i++) if (b[i] == true)System.out.printf(a[i]+" ");
System.out.println();
return;
}
if (k >= a.length)return;
b[k] = false;
helper(error_sum,a,k + 1,cur_sum,b);
b[k] = true;
cur_sum += a[k];
helper(error_sum,a,k + 1,cur_sum,b);
b[k] = false;//回溯!!!!!
}
}
打印二叉树从根节点到叶子节点的所有路径
1 | package bluebridgecup; |
汉诺塔
1 | package bluebridgecup; |
遍历二叉树
1 | package bluebridgecup; |
翻转链表
1 | package com.lifeibigdata.offer; |