File tree Expand file tree Collapse file tree 6 files changed +146
-0
lines changed
Expand file tree Collapse file tree 6 files changed +146
-0
lines changed Original file line number Diff line number Diff line change 1+ package Recursion
2+
3+ // 迭代实现阶乘
4+ type Fac struct {
5+ val map [int ]int
6+ }
7+
8+ func NewFactorial (n int ) * Fac {
9+ return & Fac {
10+ make (map [int ]int , n ),
11+ }
12+ }
13+
14+ func (fac * Fac ) Factorial (n int ) int {
15+ if fac .val [n ] != 0 {
16+ return fac .val [n ]
17+ }
18+
19+ if n <= 1 {
20+ fac .val [n ] = 1
21+ return 1
22+ }else {
23+ res := n * fac .Factorial (n - 1 )
24+ fac .val [n ] = res
25+ return res
26+ }
27+ }
28+
29+ func (fac * Fac ) Print (n int ) {
30+ println (fac .val [n ])
31+ }
Original file line number Diff line number Diff line change 1+ package Recursion
2+
3+ import "testing"
4+
5+ func TestFac_Factorial (t * testing.T ) {
6+ fac := NewFactorial (10 )
7+ for i := 1 ; i < 15 ; i ++ {
8+ fac .Factorial (i )
9+ fac .Print (i )
10+ }
11+ }
Original file line number Diff line number Diff line change 1+ package Recursion
2+
3+ import "fmt"
4+
5+ // 递归实现斐波那契数列
6+ type Fibs struct {
7+ val map [int ]int // 使用字典存储结果
8+ }
9+
10+ func NewFibs (n int ) * Fibs {
11+ return & Fibs {
12+ make (map [int ]int , n ),
13+ }
14+ }
15+
16+ func (fib * Fibs )Fibonacci (n int ) int {
17+ if fib .val [n ] != 0 {
18+ return fib .val [n ]
19+ }
20+ if n <= 1 {
21+ fib .val [1 ] = 1
22+ return 1
23+ }else if n == 2 {
24+ fib .val [2 ] = 1
25+ return 1
26+ } else {
27+ res := fib .Fibonacci (n - 1 ) + fib .Fibonacci (n - 2 )
28+ fib .val [n ] = res
29+ return res
30+ }
31+ }
32+
33+ func (fib * Fibs )Print (n int ) {
34+ fmt .Println (fib .val [n ])
35+ }
Original file line number Diff line number Diff line change 1+ package Recursion
2+
3+ import "testing"
4+
5+ func TestFibs_Fibonacci (t * testing.T ) {
6+ fib := NewFibs (10 )
7+ for i := 1 ; i < 15 ; i ++ {
8+ fib .Fibonacci (i )
9+ fib .Print (i )
10+ }
11+ }
Original file line number Diff line number Diff line change 1+ package Recursion
2+
3+ import (
4+ "fmt"
5+ )
6+ // 实现一组数据集合的全排列
7+ type RangeType struct {
8+ value []interface {}
9+ }
10+
11+ func NewRangeArray (n int ) * RangeType {
12+ return & RangeType {
13+ make ([]interface {},n ),
14+ }
15+ }
16+
17+ func (slice * RangeType )RangeALL ( start int ) {
18+ len := len (slice .value )
19+ if start == len - 1 {
20+ // 如果已经是最后位置,直接将数组数据合并输出
21+ fmt .Println (slice .value )
22+ }
23+
24+ for i := start ; i < len ; i ++ {
25+ // i = start 时输出自己
26+ // 如果i和start的值相同就没有必要交换
27+ if i == start || slice .value [i ] != slice .value [start ]{
28+ //交换当前这个与后面的位置
29+ slice .value [i ], slice .value [start ] = slice .value [start ], slice .value [i ]
30+ //递归处理索引+1
31+ slice .RangeALL (start + 1 )
32+ //换回来,因为是递归,如果不换回来会影响后面的操作,并且出现重复
33+ slice .value [i ], slice .value [start ] = slice .value [start ], slice .value [i ]
34+ }
35+ }
36+ }
37+
38+
39+
40+
Original file line number Diff line number Diff line change 1+ package Recursion
2+
3+ import "testing"
4+
5+ func TestRangeALL (t * testing.T ) {
6+ slice1 := NewRangeArray (4 )
7+ for i := 0 ; i < 4 ; i ++ {
8+ slice1 .value [i ] = i + 1
9+ }
10+ slice1 .RangeALL (0 )
11+
12+ slice2 := NewRangeArray (3 )
13+ slice2 .value [0 ] = "a"
14+ slice2 .value [1 ] = "b"
15+ slice2 .value [2 ] = "c"
16+ slice2 .RangeALL (0 )
17+
18+ }
You can’t perform that action at this time.
0 commit comments