Re: [問題] 宣告的順序不同 答案也不同

看板Mathematica作者 (-858993460)時間13年前 (2011/11/24 14:12), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《harry901 (forcing to A cup)》之銘言: : a[t_] = 5*t + 2; (*令函數a*) : b[t_] = a[t] + aa; (*令函數b*) : aaans = Array[ans, {6, 1}]; (*令空矩陣aaans*) : For[i = 1, i <= 6, i++, aa = i; (*迴圈*) : aaans[[i, 1]] = b[1]] (*將答案跑出來放入空矩陣*) : aaans (*印出來*) : 執行後可得 : {{8}, {9}, {10}, {11}, {12}, {13}} : ===================================== : aaans = Array[ans, {6, 1}]; : For[i = 1, i <= 6, i++, : b[t_] = a[t] + aa; : a[t_] = 5*t + 2; : aa = i; : aaans[[i, 1]] = b[1]] : aaans : 執行後卻變成 : {{8}, {8}, {9}, {10}, {11}, {12}} : 我猜想大概跟系統內建參數初始直有關係 : 可是...現在實在頭昏腦脹 無法解釋上面兩個結果 : ============================================================================== : 怎麼辦 實際上我的程式有兩百行 =__=~ : 尤其有很多復合函數 有些變數的宣告在For外面 有些在裡面 : 寫For迴圈的習慣要如何培養 才能避免上面的狀況出錯 : 尤其是需要連結到For外面的變數與函數時 >__<~ 你用 = 來定義函數了... 用 = 來定義函數會造成函式指定的當下就先計算完畢 所以你的第一例 : a[t_] = 5*t + 2; (*令函數a*) : b[t_] = a[t] + aa; (*令函數b*) 實際定義上的 b 已經是 5*t + 2 + aa 了 那在第二例當中 : b[t_] = a[t] + aa; : a[t_] = 5*t + 2; 這樣一來 b[t] 在第二圈定義的當下會代入 aa 第一圈的值 (1) 因此就會造成即使你改訂了 aa 的值 (aa 已經是 2 了) 計算結果還是少 1 正確的解法是用 := 來定義函數 這會使得函數在定義當下不會計算 只有存起來 要到實際求值時才會把值代進去 -- 1985/01/12 三嶋鳴海 1989/02/22 優希堂悟 1990/02/22 冬川こころ 1993/07/05 小町 つぐみ 歡迎來到 1994/05/21 高江ミュウ 1997/03/24 守野いづみ 1997/03/24 伊野瀬 チサト 1998/06/18 守野くるみ 打越鋼太郎的 1999/10/19 楠田ゆに 2000/02/15 樋口遙 2002/12/17 八神ココ 2011/01/11 HAL18於朱倉岳墜機 ∞與∫的世界 2011/04/02 茜崎空 啟動 2012/05/21 第貮日蝕計畫預定 2017/05/01~07 LeMU崩壞 2019/04/01~07 某大學合宿 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.28.91

11/24 14:18, , 1F
謝謝 看來我真的是壞習慣 一直以為:=跟=只差在先後計算
11/24 14:18, 1F
文章代碼(AID): #1EpU1G9- (Mathematica)
文章代碼(AID): #1EpU1G9- (Mathematica)