2017-05-16 18 views
-1

私は新しいプログラミングに一般的なので、私は愚かな質問を求めるために再度downvotedを得ないことを願っています。 私はプロジェクトのオイラーの問題を解決するために働いています.25桁の「1000桁のフィボナッチ数」で、私は奇妙な動作に遭遇しました。次のコードは、この動作の結果として書いたものです。ゴラン:奇妙なビッグIntの振る舞い

package main 

import (
    "fmt" 
    "math/big" 
) 

func main() { 
    index := 2 
    l := new(big.Int) 
    pl := big.NewInt(1) 
    i := big.NewInt(1) 
    for { 
     l = i 
     i.Add(i, pl) 
     pl = l 
     index++ 
     if len(i.String()) == 1000 { 
      break 
     } 
    } 
    fmt.Println(i, "\nindex: ", index) 
} 

私はうっかり2のべき乗を生成するためのきちんとした方法を発見していたことを発見した理由を決定する過程で、私は次の変更を行い、これが正しい結果を生成しなかったので、当然のことながら、これは正しい答えを生成しませんでした。私の質問は、各大のInt変数iの値に設定されるようになり、これは大きなを割り当てるための正しい方法ではありませんでした場合は、なぜこれがエラーを生成しませんでした最初の例で起こっていることである

package main 

import (
    "fmt" 
    "math/big" 
) 

func main() { 
    index := 2 
    l := new(big.Int) 
    pl := big.NewInt(1) 
    i := big.NewInt(1) 
    for { 
     l.Set(i) 
     i.Add(i, pl) 
     pl.Set(l) 
     index++ 
     if len(i.String()) == 1000 { 
      break 
     } 
    } 
    fmt.Println(i, "\nindex: ", index) 
} 

int var値?私はこのような状況に対して単に間違っている正当なbig Int操作ですか?

l = i 

pl = l 

答えて

7

行は、あなたは彼らが何を考えてやっていません。

l,およびiはポインタであり、それらを互いに割り当てるとbig.Intではなくポインタ値がコピーされます。

l = iを実行した後、lは同じbig.Intを指し、今i同じポインタ値です。 l.Set(i)を使用すると、lbig.Intの値をiの値big.Intに設定しますが、liの値は依然として2つの別々の値を指しています。

+0

ありがとうございます。それは完璧な意味合いがあります。 –