If statement Mathematica-如果语句不执行真/假

If statement Mathematica-如果语句不执行真/假,if-statement,for-loop,wolfram-mathematica,brute-force,If Statement,For Loop,Wolfram Mathematica,Brute Force,我有一个笔记本,用来对方程中使用的数组中的数字进行穷举搜索,如果方程等于定义的变量,那么它会返回方程中变量的值。唯一的问题是,最后一个For循环中的If语句从未在true/false/note函数中运行。我能让它做任何事情的唯一方法就是使用一个通用的Print[blah],然后它继续打印所有For循环中的每个迭代。这是我到目前为止所拥有的- AvTarget := -95 arr := {1, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2, 2.2, 2.4, 2.7, 3,

我有一个笔记本,用来对方程中使用的数组中的数字进行穷举搜索,如果方程等于定义的变量,那么它会返回方程中变量的值。唯一的问题是,最后一个For循环中的If语句从未在true/false/note函数中运行。我能让它做任何事情的唯一方法就是使用一个通用的Print[blah],然后它继续打印所有For循环中的每个迭代。这是我到目前为止所拥有的-

AvTarget := -95
arr := {1, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2, 2.2, 2.4, 2.7, 3, 3.3, 
  3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8, 7.5, 8.2, 9.1, 10}
trueArr := {}
falseArr := {}
For[i = 1, i <= Length[arr], i = i + 1,
 For[j = 1, j <= Length[arr], j = j + 1,
  For[k = 1, k <= Length[arr], k = k + 1,
   If[Abs[
      AvTarget - (arr[[i]] + arr[[k]] + (arr[[i]] + arr[[k]])/
         arr[[j]])] < 1000, Append[trueArr, {i, j, k}], 
    Append[falseArr, 1], Append[falseArr, 0]]
   ]
  ]
 ]
Length[trueArr]
Length[falseArr]
AvTarget:=-95
arr:={1,1.1,1.2,1.3,1.5,1.6,1.8,2,2.2,2.4,2.7,3,3.3,
3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8, 7.5, 8.2, 9.1, 10}
trueArr:={}
falseArr:={}

对于[i=1,i您应该将
Append
的返回值分配给相应的变量。

您应该将
Append
的返回值分配给相应的变量。

Append[trueArr,{i,j,k}给trueArr加上{i,j,k}后丢弃结果。您想要trueArr=Append[trueArr,{i,j,k}]。
另外,“:=”是SetDelayed运算符。您应该使用“=”

Append[trueArr,{i,j,k}]给trueArr加上{i,j,k},然后丢弃结果。您需要trueArr=Append[trueArr,{i,j,k}]。
另外,“:=”是SetDelayed运算符。您应该使用“=”

循环几乎总是使用Mathematica的错误方法。我将您的原始代码重写为

avTarget = -95;
arr := {1, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2, 2.2, 2.4, 2.7, 3, 3.3, 
  3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8, 7.5, 8.2, 9.1, 10};
triples = Tuples[arr, 3];
trueArr = Select[triples, Abs[avTarget - (#[[1]] + #[[3]] + (#[[1]] + #[[3]])/#[[2]]) < 
    1000] &];
falseArr = Complement[triples,trueArr];
avTarget=-95;
arr:={1,1.1,1.2,1.3,1.5,1.6,1.8,2,2.2,2.4,2.7,3,3.3,
3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8, 7.5, 8.2, 9.1, 10};
三元组=元组[arr,3];
trueArr=Select[triples,Abs[avTarget-(#[[1]]+#[[3]]+(#[[1]]+#[[3]])/#[[2]])
1000] &];
falseArr=补码[三元组,trueArr];

我已经使用Mathematica大约20年了,我记不起曾经需要过循环。当然,有时使用循环来表达算法比Mathematica提供的函数替代方案更容易,但你真的应该摆脱它们提供的拐杖,走Mathematica的路。

循环几乎总是错误的方式跟Mathematica一起去,我把你的原始代码改写成

avTarget = -95;
arr := {1, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2, 2.2, 2.4, 2.7, 3, 3.3, 
  3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8, 7.5, 8.2, 9.1, 10};
triples = Tuples[arr, 3];
trueArr = Select[triples, Abs[avTarget - (#[[1]] + #[[3]] + (#[[1]] + #[[3]])/#[[2]]) < 
    1000] &];
falseArr = Complement[triples,trueArr];
avTarget=-95;
arr:={1,1.1,1.2,1.3,1.5,1.6,1.8,2,2.2,2.4,2.7,3,3.3,
3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8, 7.5, 8.2, 9.1, 10};
三元组=元组[arr,3];
trueArr=Select[triples,Abs[avTarget-(#[[1]]+#[[3]]+(#[[1]]+#[[3]])/#[[2]])
1000] &];
falseArr=补码[三元组,trueArr];

我已经使用Mathematica大约20年了,我记不起是否需要循环。当然,有时使用循环来表达算法比Mathematica提供的函数替代方案更容易,但你真的应该摆脱它们提供的拐杖,走Mathematica的路。

如果不是,我已经添加了一点额外的内容太麻烦了,你能给我一个建议吗?就我个人而言,我想把它全部放在一个While循环中,慢慢地递增
tol
,直到
Length[trueArr]>0
。另外,你知道一种使用值并在字符串中作为字符串传递的方法吗?例如,在ruby中,你会像
那样做,答案是:{x}
我增加了一点额外的内容,如果不太麻烦的话,你能给我一个建议吗?我个人在想把它放在一个While循环中,慢慢增加
tol
直到
Length[trueArr]>0
。另外,您知道如何使用值并将其作为字符串中的字符串传递吗?例如,在ruby中,您可以像
“答案是:#{x}”
。这很酷。我已经将该代码合并到其中(谢谢,我以后也可以大量使用它)但是,当我调用trueArr时,它似乎不会返回值,有没有一种具体的方法我必须这样做?哦,发现了问题,放错了括号,Abs只用于AvTarget-equation部分。这很酷。我已经将该代码合并到它中(谢谢,我以后也可以大量使用它)但是当我调用trueArr时,它似乎不会返回值,有没有一种具体的方法可以这样做?哦,找到了问题,放错了括号,Abs只针对AvTarget-equation部分。