コア開発の研究ノート(13)を行きます! - 再帰関数呼び出しメカニズム、

方法:完了コード又は機能のセット。
一般的なプロセス:入力する方法必要に応じて、メソッドは結果を返します。

分析の基礎となる関数呼び出しメカニズム:
スタックエリア:基本データ型は、一般的にスタック領域に割り当てられているが、エスケープ分析コンパイラがあります。
ヒープ:ヒープ領域に割り当てられた一般的な参照データ型は、エスケープ解析コンパイラがあります。
エリアコード:コード格納用メモリ領域

プロシージャを呼び出すことにより、関数呼び出しが行われているものの深い理解を持っています:

package main
import "fmt"

func calcu (a float64,b float64) (float64,float64) {
	
	plus := a + b
	minus := a - b
	return plus,minus
}
func main() {
	/*
	第一步 main是一切程序的入口,首先现在内存栈区开辟一块空间存储变量
	      a=5 b=3 都是基本变量,一般存在内存栈区
	 */
	var (
		a float64 = 5
		b float64 = 3
	)
	/*
	第二步 调用函数,将两个变量的值传入函数中,系统在内存栈区开辟另一块儿空间放入被调用函数,
	       这个地方的函数的内存与main程序的内存空间完全是两个用户空间,这也就是说为何被调用函数如果
	       没有返回值,就是两个完全不相干的函数调用,也就失去了调用意义,调用结束返回后,return结束
	       被调用函数,并且返回值,编译器就会将这部分垃圾回收,回到main()中继续走完
	 */
	max, min := calcu(a,b)
	
	/*
	第三部 执行接下来main中的其他语句,直到执行完成后,编译器回收所有占据内存的垃圾。
	 */
	fmt.Println(max)
	fmt.Println(min)
}

再帰関数呼び出し

  1. 自身が自分自身を呼び出す関数の本体内の関数は再帰呼び出しです。
  2. ケース:

主パッケージ
のインポート"FMT"
FUNCのrecu(N-のfloat64){
N-> 2 {IF
N-
recu recu内部recu(N-)//反復()、各反復成功断面は、それぞれ他の変数とは別のユーザ空間を有していますインパクト。
{}他
fmt.Println( "N- =" N-)
新しい値生成ので関数は、戻り値を持たないまで} //端
}
FUNCメイン(){
VAR A =のfloat64。4
recu(A)//ありません任意の戻り値、コールの後の次のいずれかの出力を生成しないように
}

  1. 再帰は常に無限に近い再帰条件を終了したい、または無限再帰、無限ループです。

  2. 機能が終了、または戻りが発生している場合は、への呼び出しが戻るに準拠人、返し、関数が完成またはリターンであるとき、システムの機能そのものが破壊され、もはやメモリ空間を占有しません。

  3. 再帰呼び出し演習:再帰的フィボナッチ数を用いて計算し、n番目のランダムな整数には、値の列の数はどのくらいです見つけますか?

    package main
    import "fmt"
    func fbnq(n int) int {
    
    	if n == 1 || n==2 {
    		return 1
    	} else {
    		return fbnq(n-1) + fbnq(n-2)
    	}
    }
    func main() {
    	res := fbnq(6)
    	fmt.Println(res)
    }
    
  4. 関数値を、既知のF(1)= 3、F(N)= 2 * F N(N)F 1つの取得に割り当てられる(N)+ 1は、である必要がありますか?

    package main
    import "fmt"
    func f(n int) int {
    
    	if n == 1 {
    		return 3
    	} else {
    		return 2*f(n-1) + 1
    	}
    }
    
    func main() {
    	res := f(6)
    	fmt.Println(res)
    }
    
  5. 猿が桃を食べて、最初の日は、十分の一日食べて、その後、桃の半分を食べてどのように多くの桃の合計を求め、唯一の桃を見つけました

    package main
    import (
    	"fmt"
    )
    func f(n int) int {
    
    	if n == 10 {
    		return 1
    	} else {
    		return (f(n+1) + 1) * 2      //其实这个else有问题,需要限定范围,1<n<10
    	}
    }
    
    func main() {
    	res := f(1)
    	fmt.Println(res)
    }
    

メモ機能の詳細と話し合う
8をパラメータリストは複数であってもよいし、返されたリストは、複数であってもよいし、ブラケットの戻り値の複数添加しなければなりません。
9.パラメータリストや戻り値のデータ型は、値型のリストでも使用されているタイプかもしれません。
例最初の文字は、関数が他のパッケージに呼び出されたかどうかを決めたので、10関数名の最初の文字は、Javaの資本パブリックに似て、理解することはそうのように、数字にすることはできません、小文字はプライベートです。
11.スコープ機能:機能は、ローカル変数であり、外部関数は、ユーザ空間に対応する機能を有効になりません。
12. 基本データ型および配列のデフォルト値を変更機能では、渡され、それが元の値に影響を与えないであろう。
またはコピーの価値を理解し、呼び出し元の関数の値自体には影響しません。

13. あなたは、関数内で外部変数で変数のアドレスを変数機能を変更したいと値の主な影響が参照によって渡される変数の方法で、関数ポインタを渡すことができます。

**举例值传递,函数在变量+10后,并不会影响主函数中n值不变。**
```
package main                                               
import "fmt"
func test(n int) int {                               
	n = n + 10                           
	fmt.Println("test n = ",n)                 
	return n               
}
func main() {
	var n int = 10
	test(n)
	fmt.Println("main n = ",n)
}                                // main n=10
```

**举例指针传递,函数在指针取值后,影响到主函数中的n,使n+10变为了20:**
```
package main
import "fmt"
func test1(n *int) int {
	*n = *n + 10
	fmt.Println("test n = ",*n)
	return *n
}
func main() {
	var n int = 10
	test1(&n)
	fmt.Println("main n = ",n)
}                                //main n=20
```
  1. 伝統的な関数のオーバーロードをサポートしていませGolang、たとえ異なるパラメータの数があまりにも、同じ名前が存在するとの二つの機能を可能にしました。

  2. Golangは、データタイプの関数は、関数の変数で呼び出すことができ、変数のタイプの関数である変数に割り当てることができ、変数、関数、機能追加=エイリアス変数にメモリ機能を容易に理解されるであろう()問題はない、その変数()問題ありません。

  3. 関数も呼び出しの引数を行うことができ、

    package main
    import "fmt"
    func getSum (n1 int,n2 int) int {
    	return n1 + n2
    }
    func ff (ff func(int,int) int, num1 int, num2 int) int {     // ff类型为函数类型,与getSum一致,再传 n1 ,n2 形参, 再返回一个int返回值
    	return ff(num1 , num2)
    }
    
    func main() {
    	res2 := ff(getSum,10,20)
    	fmt.Println(res2)
    }
    
  4. データ型定義を単純化するために、Goはカスタムデータ型をサポート://ミンにint型int型追加エイリアスをタイプ対応を、VAR XXミント(実際にはint型)は
    、好ましくは、文言がパラメータの関数として扱われている、myfunc関数FUNCを入力(int型、int型)のint // myfunc関数型対応デュアル関数の戻り値の型の単一のパラメータに

  5. 支援機能は、指定の値を返す:戻り値の定義は、定義されたときにFUNCをFUNC(N1 INT、N2 INT) (和INT、サブINT){...} // これは、2つの値を返すであろう直接定義され、点のないシーケンスが存在しませんA。最後に、この関数は返す必要があり、かつ任意のリターンを追加する必要はありません。

  6. さらに二つの戻り値は、_無視使用することができ、私はちょうど1を取得したい、他の必要はありません。

  7. Goは可変パラメータ、例えばサポートFUNC getSum(引数... INT)( ...和INT){...} //引数を7バイトには不可欠であり、0は複数のパラメータを渡します。
    getSum(N1のfloat64、引数... FUNC INT)(和INT){...} // のfloat64を渡し、パラメータINT複数の1を渡す
    引数スライスであるそれぞれの値は、引数[I]でアクセスでき、それが理解されていますダイナミックアレイ。

    ケース:FUNC getSum(引数... int型)(和int型){...}パラメータを渡す方法については:

    package main
    import "fmt"
    func get1Sum (n1 int, args... int)  int {      //args可以变成其他的字符,vars也可以,但是一般约定俗成,不要乱改。
    	sum := n1                                  //可变参数args一定要放在形参列表里的最后
    	for i := 0 ; i < len(args) ; i++ {
    		sum += args[i]
    	}
    	return sum
    }
    func main() {
    	res := get1Sum(1,2,3,4,5)
    	fmt.Println(res)
    }
    
公開された50元の記事 ウォン称賛18 ビュー4016

おすすめ

転載: blog.csdn.net/weixin_41047549/article/details/89684168