我无法在 Maxima 中找到任何文档。所以,我尝试编写自己的文档,它给出了元素和它们的位置。只要满足条件,它就会从列表中的任何地方开始。我最终得到了两个有细微差别的函数,
takewhile(x,p):=block([s:1,temp:[],temp1:[],count:1,xx:create_list([x[i],i],i,makelist(i,i,length(x)))],
for i in xx do if apply(p,[first(i)]) then temp:cons(i,temp) ,temp:reverse(temp),
if(length(temp)>=2 and flatten(temp)#[]) then
(while(count<length(temp) and last(temp[s])+1=last(temp[s+1]) ) do
(temp1:cons(temp[s],temp1),count:count+1,s:s+1),
if(s<=length(temp)) then (temp1:cons(temp[s],temp1)) else print("Exceeded")) else temp1:temp,reverse(temp1))$
用法 ::
takewhile([2,1,2,3,4,5,7,4,1,4,5,2,1,7,8],lambda([x],x>3));
输出 ::
[[4,5],[5,6],[7,7],[4,8]]
第二个,
takewhile1(x,p):=block([s:1,temp:[],temp1:[],count:1,xx:create_list([x[i],i],i,makelist(i,i,length(x)))],
for i in xx do (if parse_string(concat(first(i),p)) then temp:cons(i,temp)) ,temp:reverse(temp),
if(length(temp)>=2 and flatten(temp)#[]) then
(while(last(temp[s])+1=last(temp[s+1]) and count<length(temp)) do
(temp1:cons(temp[s],temp1),count:count+1,s:s+1),
if(s<length(temp)) then temp1:cons(temp[s],temp1)) else temp1:temp,reverse(temp1))$
用法 ::
takewhile1([2,1,2,3,4,5,7,4,1,4,5,2,1,7,8],\<5);
输出 ::
[[2,1],[1,2],[2,3],[3,4],[4,5]]
细微的区别在于使用parse_string
创建 lambda 函数而不是应用作为函数参数的 lambda。
Problem
:我可以,
takewhile([2,1,2,3,4,5,7,4,1,4,5,2,1,7,8],lambda([x],x^2+3*x>6));
输出 ::
[[2,1]]
但是如果我在takewhile1
返回时使用它,我不知道如何实现它,
concat: argument must be an atom; found ^2>5