天道酬勤,学无止境

Force evaluate index expression before passing to sum()

I want to write an (somehow) enhanced sum function which takes a number of indices at once, but I cannot understand how to get it work. Here is what I currently have:

(%i1) nsum(indexes, expr) :=
          if indexes = []
          then expr
          else nsum(rest(indexes), sum(expr, first(indexes),1, N)) $

(%i2) nsum([i,j], i+j), nouns;
      sum: index must be a symbol; found intosym(first(indexes))
      #0: nsum(indexes=[k,j],expr=k+j)

I think this could be fixed by forcing Maxima expand first(indexes) into a symbol before passing to sum function. I tried ''(...) and ev(..., nouns), but without any success.

评论

After some reading and trying I came to the following solution which uses apply function to pre-evaluate arguments for sum:

nsum(indexes, expr) :=
    if indexes = []
    then expr
    else nsum(rest(indexes), apply(sum, ['expr, indexes[1], 1, N])) $

UPD1:
Unfortunately, there is something wrong with the above code, as it works well only for relatively simple expressions. In my case the straightforward approach works fine where nsum fails:

(%i1) rot[i](f) := sum(sum(sum(sum(
      G[r,i]*G[q,j]*w[i,j,k]*('diff(f[k], y[q]) + sum(K[k,q,m]*f[m], m, 1, N)),
        r, 1, N),
        j, 1, N),
        k, 1, N),
        q, 1, N) $

(%i2) rot2[i](f) := nsum( [r,j,k,q],
        G[r,i]*G[q,j]*w[i,j,k]*('diff(f['k], y[q]) + sum(K[k,q,m]*f[m], m, 1, N))) $

(%i3) rot[1](f);
(%o3) ... Yelds the result.

(%i4) rot2[1](f);
apply: subscript must be an integer; found: k
lambda([i,j],diff(ys[i],x[j]))(i=k,j=1)

UPD2:

The code works indeed. It was 'k accidentally left in rot2 definition instead of just k.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Haskell中的懒惰和尾巴递归,为什么会崩溃?(Laziness and tail recursion in Haskell, why is this crashing?)
    问题 我有一个相当简单的函数来计算一个大列表的元素的均值,使用两个累加器来保存到目前为止的总和和到目前为止的计数: mean = go 0 0 where go s l [] = s / fromIntegral l go s l (x:xs) = go (s+x) (l+1) xs main = do putStrLn (show (mean [0..10000000])) 现在,用严格的语言来说,这将是尾递归的,并且不会有问题。 但是,由于Haskell懒惰,我的谷歌搜索使我了解到(s + x)和(l + 1)将作为重击传递给递归。 因此,整个事情崩溃并燃烧: Stack space overflow: current size 8388608 bytes. 进一步搜寻之后,我发现了seq和$! 。 这似乎是我不理解的,因为在这种情况下所有尝试使用它们的尝试都被证明是徒劳的,错误消息说明了有关无限类型的内容。 最后,我找到了-XBangPatterns ,它可以通过更改递归调用来解决所有问题: go !s !l (x:xs) = go (s+x) (l+1) xs 但是我对此不满意,因为-XBangPatterns当前是扩展。 我想知道如何在不使用-XBangPatterns情况下使评估严格。 (也许也学点东西!) 只是为了让您了解我的理解不足,这是我尝试过的方法
  • 括号是否强制求值顺序并定义了未定义的表达式?(Do parentheses force order of evaluation and make an undefined expression defined?)
    问题 当我遇到这个问题时,我正浏览我的教科书 以下表达式之后a的值是什么? 假设a的初始值为5。 a + =(a ++)+(++ a) 起初,我认为这是未定义的行为,因为对a进行了多次修改。 因此,我阅读了该问题,并说了步骤,所以我可能认为这个问题是正确的。 所以我的问题是: 应用括号是否可以定义未定义的行为? 评估括号表达式后是否创建了序列点? 如果定义了,由于++和()具有相同的优先级,因此括号的重要性如何 注意:解释清楚,明确的答案将赢得我的投票 回答1 不,使用括号并不能使其成为定义的行为。 它仍然是未定义的。 C99标准§6.5¶2说 在上一个序列点与下一个序列点之间,对象的存储值最多只能通过对表达式的求值来修改。 此外,在先值仅应被读取以确定要存储的值。 将子表达式放在括号中可能会强制评估子表达式的顺序,但不会创建序列点。 因此,它不能保证子表达式(如果产生任何副作用)何时会发生。 再次引用C99标准§5.1.2.3¶2 评价表达可能会产生副作用。 在执行序列中某些特定的点(称为顺序点)上,以前评估的所有副作用都应完整,并且以后评估的任何副作用都不应发生。 为了完整起见,以下是附件C中C99标准规定的顺序点。 对参数进行求值后,对函数的调用。 以下运算符的第一个操作数的结尾:逻辑AND && ; 逻辑或|| ; 有条件的? ; 逗号, 。 完整声明符的结尾。
  • Java中评估顺序的规则是什么?(What are the rules for evaluation order in Java?)
    问题 我正在阅读一些Java文本,并获得以下代码: int[] a = {4,4}; int b = 1; a[b] = b = 0; 在本文中,作者没有给出清晰的解释,最后一行的效果是: a[1] = 0; 我不确定自己是否理解:评估是如何发生的? 回答1 让我说得很清楚,因为人们一直误会这一点: 子表达式的求值顺序与关联性和优先级无关。 结合性和优先级确定按照什么顺序执行的运营商但以什么顺序的子表达式求值无法确定。 您的问题与子表达式的计算顺序有关。 考虑A() + B() + C() * D() 。 乘法比加法具有更高的优先级,并且加法是左联想的,所以它等效于(A() + B()) + (C() * D())但是知道这只会告诉您第一个加法将发生在第二次加法之前,并且乘法将在第二次加法之前发生。 它不会告诉您将以什么顺序调用A(),B(),C()和D()! (它也不会告诉你的乘法运算是之前还是先添加后发生的。)这将是完全有可能通过编写此作为服从优先级和关联的规则: d = D() // these four computations can happen in any order b = B() c = C() a = A() sum = a + b // these two computations can happen in any order product = c *
  • Haskell 计算函数执行的时间(Haskell calculate time of function performing)
    问题 我试图编码来计算函数花费的时间 list <- buildlist 10000 10000 starttime <- getClockTime let sortedlist = quicksort list endtime <- getClockTime let difftime = diffClockTimes endtime starttime 功能构建列表: buildlist :: Int -> Int -> IO [Int] buildlist n m = do seed <- getStdGen let l = randomRs (0, m) seed let list = take n l return list 功能快速排序: quicksort [] = [] quicksort (x:xs) = let head = [a|a<-xs,a<=x] tail = [a|a<-xs,a>x] in quicksort head ++ [x] ++ quicksort tail 第一个问题:当我输出 difftime 时,无论列表有多长,它始终为零。 第二个:我想知道 Real World Haskell 代码中的“>>=”是什么意思。 getClockTime >>= (\(TOD sec _) -> return sec) 第三
  • 是否有可以像VBA的IIF一样内联放置的Matlab条件IF运算符(Is there a Matlab conditional IF operator that can be placed INLINE like VBA's IIF)
    问题 在VBA中,我可以执行以下操作: A = B + IIF(C>0, C, 0) 因此,如果C> 0,我得到A=B+C而C <= 0,我得到A=B 是否有运算符或函数可以让我在MATLAB代码中内联执行这些条件? 回答1 Matlab中没有三元运算符。 当然,您可以编写一个可以执行此操作的函数。 例如,以下函数与iif一起使用,条件为nd输入,结果a和b为数字和单元格: function out = iif(cond,a,b) %IIF implements a ternary operator % pre-assign out out = repmat(b,size(cond)); out(cond) = a; 对于更高级的解决方案,有一种方法可以创建甚至可以执行其他操作的内联函数,如本博客文章中有关匿名函数恶作剧的概述所述: iif = @(varargin) varargin{2*find([varargin{1:2:end}], 1, 'first')}(); 您将此功能用作 iif(condition_1,value_1,...,true,value_final) 用任意数量的附加条件/值对替换点。 它的工作方式是从值中选择第一个条件为真的值。 2*find(),1,'first')提供值参数的索引。 回答2
  • Erlang 出现错误 ** 1: 之前的语法错误:'->' **(Erlang getting error ** 1: syntax error before: '->' **)
    问题 我已经开始在 Erlang 中进行一些实践,但我得到: ** 1: syntax error before: '->' **每当我为例如声明任何函数时。 计算列表的总和(这是实验性的,当然有内置函数用于查找列表的总和)。 sum([]) -> 0; sum([H | T]) -> H + sum(T). 在 erl shell (v 5.5.5) 中。 提前致谢 回答1 您不能使用与 erl 文件中相同的语法在 shell 中定义函数。 你可以定义乐趣。 shell 中的语法需要是: Sum = fun([], _) -> 0; ([H | T], F) -> H + F(T, F) end, Sum([1,2,3], Sum). 请注意,递归匿名函数(这是)是以一种丑陋的方式定义的。 您基本上必须将函数作为参数传递给自身。 回答2 直接的答案是在模块定义文件中你有属性,比如-module(). ,- -export(). 等等,以及函数定义,而在 shell 中输入要计算的表达式。 函数定义不是表达式。 如果你想在 shell 中定义一个本地的临时函数,你需要像 @DanielLuna 所示使用 fun 函数。 这些实际上是匿名的未命名函数,因此递归地调用它们是一种痛苦,这不是 Erlang 特有的,而是所有匿名函数共有的。 NB Sum = fun([], _) -> 0
  • “无法计算表达式...”错误(“Cannot evaluate expression…” error)
    问题 在 Visual Studio 2010 beta 2 中调试应用程序时,突然出现以下错误。 “无法评估表达式,因为线程在垃圾收集不可能的地方停止,可能是因为代码已优化” 监视窗口中的几乎每个属性或字段都显示此消息。 有谁知道发生了什么? 以及如何摆脱它? 项目属性构建选项卡上的复选框“优化代码”已关闭。 回答1 这是有关此问题的讨论的链接。 显然,当函数参数是结构体时,堆栈上调用函数所需的总内存超过了 Visual Studio 调试器呕吐的一些神奇数字。 引用 我认为结构中所有对象的“引用”总大小和方法上的附加参数大于 256 字节。 我从 MS 那里得到了关于这个问题的回复: “...一般来说,当传递给被调用函数的参数总大小大于 256 字节时,JIT 会使调用函数部分可中断。在部分可中断代码中,并非代码中的每个位置都是 GC 安全的点。因此,在某些位置计算表达式可能不安全。发生这种情况时,您会收到 [错误消息]。” 因此,即使字段是引用,它们的总和似乎也超过了调试器的 256 字节限制。 我也有来自 OpenTK 框架讨论的链接。 引用 我做了一些挖掘,似乎问题源于这样一个事实,即矩阵或向量等数学数据结构是“结构”类型。 C# 对值类型有一个限制,即当作为参数传递给函数时,它们不应超过 256 字节的数据,除非它们是通过引用传递的。
  • 为什么惰性评估有用?(Why is lazy evaluation useful?)
    问题 我一直想知道为什么惰性评估是有用的。 我还没有任何人以有意义的方式向我解释; 大多数情况下,它最终变得沸腾以“信任我”。 注意:我不是指记忆。 回答1 主要是因为它可以提高效率-如果不使用值,则无需计算值。 例如,我可以将三个值传递给一个函数,但是根据条件表达式的顺序,实际上只能使用一个子集。 在像C这样的语言中,无论如何都要计算所有三个值。 但是在Haskell中,仅计算必要的值。 它还允许诸如无限列表之类的很酷的东西。 我不能像C这样的语言拥有无限的列表,但是在Haskell中,这没问题。 无限列表经常在某些数学领域中使用,因此具有操纵它们的功能可能会很有用。 回答2 惰性评估的一个有用示例是使用quickSort : quickSort [] = [] quickSort (x:xs) = quickSort (filter (< x) xs) ++ [x] ++ quickSort (filter (>= x) xs) 如果现在要查找列表的最小值,则可以定义 minimum ls = head (quickSort ls) 它首先对列表进行排序,然后获取列表的第一个元素。 但是,由于延迟计算,因此仅计算头部。 例如,如果我们取列表[2, 1, 3,] 2,1,3 [2, 1, 3,]最小值[2, 1, 3,] quickSort将首先过滤掉所有小于2的元素。
  • 好奇心:为什么 Expression<...> 在编译时比最小的 DynamicMethod 运行得更快?(Curiosity: Why does Expression<…> when compiled run faster than a minimal DynamicMethod?)
    问题 我目前正在做一些最后的优化,主要是为了好玩和学习,并发现了一些给我留下几个问题的东西。 首先,问题: 当我通过使用 DynamicMethod 在内存中构造一个方法并使用调试器时,在反汇编器视图中查看代码时,有什么方法可以让我进入生成的汇编代码? 调试器似乎只是为我跳过了整个方法或者,如果这不可能,我是否可以以某种方式将生成的 IL 代码作为程序集保存到磁盘,以便我可以使用 Reflector 检查它? 为什么我的简单加法方法 (Int32+Int32 => Int32) 的Expression<...>版本比最小的 DynamicMethod 版本运行得更快? 这是一个简短而完整的程序,用于演示。 在我的系统上,输出是: DynamicMethod: 887 ms Lambda: 1878 ms Method: 1969 ms Expression: 681 ms 我希望 lambda 和方法调用具有更高的值,但 DynamicMethod 版本始终慢 30-50%(变化可能是由于 Windows 和其他程序)。 有谁知道原因吗? 这是程序: using System; using System.Linq.Expressions; using System.Reflection.Emit; using System.Diagnostics; namespace
  • 十一届蓝桥杯省赛C语言B组——试题 F: 成绩统计
    十一届蓝桥杯省赛C语言B组——试题 F: 成绩统计 时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分 【问题描述】 小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。 【输入格式】 输入的第一行包含一个整数 n,表示考试人数。 接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。 【输出格式】 输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分四舍五入保留整数。 【样例输入】 7 80 92 56 74 88 100 0 【样例输出】 71% 43% 【评测用例规模与约定】 对于 50% 的评测用例,1 ≤ n ≤ 100。对于所有评测用例,1 ≤ n ≤ 10000。 C语言代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> int main() { int sum,temp; float pass,excellence; int passsum=0,excellencesum=0; scanf("%d",&sum); for
  • 我可以强制mysql首先执行子查询吗?(Can i force mysql to perform subquery first?)
    问题 我有这样的查询: SELECT `table_1`.* from `table_1` INNER JOIN `table_2` [...] INNER JOIN `table_3` [...] WHERE `table_1`.`id` IN( SELECT `id` FROM [...] ) AND [more conditions] 当我使用EXPLAIN时,结尾处有“ DEPENDENT SUBQUERY”,但我希望先执行此子查询,然后再执行其他条件。 有可能吗? 回答1 SELECT `table_1`.* FROM `table_1` INNER JOIN `table_2` [...] INNER JOIN `table_3` [...] WHERE `table_1`.`id` IN ( SELECT `id` FROM [...] ) AND [more conditions] 如果内部表已正确索引,则严格意义上来说,此处的子查询根本不会“执行”。 由于子查询是IN表达式的一部分,因此条件被压入子查询中,并将其转换为EXISTS 。 实际上,此子查询在每个步骤上都进行评估: EXISTS ( SELECT NULL FROM [...] WHERE id = table1.id ) 您实际上可以在EXPLAIN EXTENDED提供的详细描述中看到它。
  • 强制在替换期间立即评估回参考(Force immediate evaluation of backreference during replace)
    问题 我遇到一个错误,我将多个字符串连接在一起以获得要替换的字段。 以下是我的脚本正在执行的示例: $TEXTTOREPLACEWITH= '6Q' (Get-Content testfile.html) | ForEach-Object { $_ -replace '(.*)\$\(STRINGTOREPLACE\)(.*)', ('$1' +$TEXTTOREPLACEWITH+'$2') 如果我对具有行输入的文件运行此命令,如下所示: abc$(STRINGTOREPLACE)xyz 我期望以下输出: abc6Qxyz INSTEAD,当我运行此脚本时,输出如下所示: $16Qxyz 我假设这是由于在字符串连接完成之前不得解析反向引用。 PowerShell中是否有任何方法可以立即解决这些反向引用,并避免出现我看到的输出? 回答1 1,遗漏了要点,答案被替换了... 当连接'$1'和'6Q' (传递给正则表达式引擎之前)时,您将获得$16Q并且没有第16个捕获可替换。 为避免这种情况,请在匹配项( (?<name>) )中使用命名组,在替换字符串中使用${name} 。 请参阅文档,并注意: 如果number未指定在正则表达式模式中定义的有效捕获组,则$number被解释为用于替换每个匹配项的文字字符序列。 回答2 您也可以尝试使用命名的捕获组: $rx = '(?i)(
  • IntelliJ IDEA2019 详细配置图解-idea debug断点调试详细整理
    注:IDEA版本为2019.2.4 文章目录 一.Debug设置及窗口介绍1.1 Debug设置及入口1.2 Debug窗口及功能简介 二.Variables变量及变量视窗2.1查看参数值2.2设置修改变量值2.3查看方法返回值设置2.4 Watches窗口参数 三.Evaluate Expression计算表达式3.1计算结果3.2临时修改参数内容 四.Breakpoints断点详细设置4.1主要参数说明4.2异常捕获及定位 五.断点回退5.1回退方式15.2回退方式2 六.中断断点七.分析Java Stream操作八.主动抛出异常(不修改代码)九.检测死锁 一.Debug设置及窗口介绍 1.1 Debug设置及入口 在设置里勾选Show debug window on breakpoint,则请求进入到断点后自动激活Debug窗口 选择项目后,点击右边小甲虫图标或者shift +F9触发debug活动窗口 1.2 Debug窗口及功能简介 1-断点: 在左边行号栏右侧单击左键,或者快捷键Ctrl+F8 打上/取消断点。 1.1 移动断点 要移动断点,请将其拖动到目标行。 1.2 复制断点 要复制断点,请按Ctrl并将其拖动到目标行。 1.3 禁用断点 要临时禁用断点而不将其从项目中删除,请按住 Alt 键并单击装订线中的断点图标。 1.4 断点分组,例如
  • 【Leetcode-算法】1.两数之和(C/C++三种解法:暴力、双指针、哈希)
    为了防止太久不写代码导致老年痴呆提前,立了个刷Leetcode的Flag,开篇blog记录一下写的时候思路、问题与解决方法。 熟悉环境+康复训练,所以先从最最最基础的题开始做。 1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 小声bb: 说实话,第一眼看题我觉得是送分题,这不两个for暴力冲就完事了吗? 然后看了一下,嗯?还有模板?以前刷oj不都是交个空文件啥的嘛,这样的形式还蛮新奇的(土包子发言)。 光速写完代码后执行错误(……),有点尴尬,瞄了一眼评论区的代码心思着这不是和我代码差不多嘛,仔细一看评论区的没有returnSize这玩意,而我的模板中是有的,说明要用到。于是尝试着加了个*returnSize = 2;,果然过了。 AC代码(C):O(n²) int* twoSum(int* nums, int numsSize, int target,int* returnSize){ *returnSize = 2; static int
  • Force expansion of an expression inside a Clojure macro
    I am trying to use Stuart Sierra's do-template macro inside a defprotocol and the Clojure compiler complains that I am redefining do-template -- not what I intend: (defprotocol AProtocol (a-method [_]) (do-template [name] `(~(symbol (str name "-method")) [this that]) foo bar baz)) This should expand to: (defprotocol AProtocol (a-method [_]) (foo-method [this that]) (bar-method [this that]) (baz-method [this that])) The problem (I believe) is that the do-template s-expression is getting passed to defprotocol unexpanded. Is there any way to cause it to evaluate before being passed? BTW, do
  • C的基本原理:double变量不等于double表达式吗?(C fundamentals: double variable not equal to double expression?)
    问题 我正在使用一个称为indata的双精度数组(在堆中,使用malloc分配),以及一个名为sum的局部双精度数组。 我编写了两个不同的函数来比较indata值,并获得了不同的结果。 最终,我确定差异是由于条件测试中使用表达式的一个函数引起的,而另一原因是由于在同一条件测试中使用局部变量的另一个函数引起的。 我希望这些等同。 我的功能A使用: if (indata[i]+indata[j] > max) hi++; 而我的函数B使用: sum = indata[i]+indata[j]; if (sum>max) hi++; 经过相同的数据集和max ,根据使用的函数,最终得到不同的hi值。 我相信功能B是正确的,而功能A是令人误解的。 类似地,当我尝试下面的代码片段时 sum = indata[i]+indata[j]; if ((indata[i]+indata[j]) != sum) etc. 该条件将评估为true。 虽然我知道浮点数不一定能提供精确的表示形式,但是当将其作为表达式与存储在变量中进行比较时,为什么这种不精确的表示形式会改变? 是否建议最好的最佳做法是始终在条件条件之前评估这样的双重表达式? 谢谢! 回答1 我怀疑您使用的是32位x86,这是唯一一个精度过高的通用体系结构。 在C语言中, float和double类型的表达式实际上被评估为float
  • 我可以在方法调用中强制自己短路吗?(Can I force my own short-circuiting in a method call?)
    问题 假设我想检查一堆对象以确保没有一个为空: if (obj != null && obj.Parameters != null && obj.Parameters.UserSettings != null) { // do something with obj.Parameters.UserSettings } 编写一个辅助函数来接受可变数量的参数并简化这种检查是一个诱人的前景: static bool NoNulls(params object[] objects) { for (int i = 0; i < objects.Length; i++) if (objects[i] == null) return false; return true; } 那么上面的代码就可以变成: if (NoNulls(obj, obj.Parameters, obj.Parameters.UserSettings)) { // do something } 正确的? 错误的。 如果obj为空,那么当我尝试将obj.Parameters传递给NoNulls时,我会得到一个NullReferenceException 。 所以上述方法显然是错误的。 但是使用&&运算符的if语句工作得很好,因为它是短路的。 那么:有什么方法可以使方法短路,以便在方法中明确引用之前不会评估其参数? 回答1 好吧
  • Delphi 编译器指令反向评估参数(Delphi Compiler Directive to Evaluate Arguments in Reverse)
    问题 使用 Math.pas 中的 IFThen 函数的 delphi 2 班轮给我留下了深刻的印象。 但是,它首先评估 DB.ReturnFieldI,这很不幸,因为我需要调用 DB.first 来获取第一条记录。 DB.RunQuery('select awesomedata1 from awesometable where awesometableid = "great"'); result := IfThen(DB.First = 0, DB.ReturnFieldI('awesomedata1')); (作为一个毫无意义的澄清,因为我已经得到了很多好的答案。我忘了提到 0 是 DB.First 返回的代码,如果它里面有东西,否则可能没有意义) 显然这没什么大不了的,因为我可以让它与五个坚固的衬垫一起工作。 但是我需要让 Delphi 首先评估 DB.first,然后评估 DB.ReturnFieldI。 我不想更改 math.pas 并且我不认为这保证我使 ifthen 重载,因为有 16 个 ifthen 函数。 只要让我知道编译器指令是什么,如果有更好的方法来做到这一点,或者如果没有办法做到这一点,任何人的过程是调用 db.first 并盲目地检索他找到的第一件事不是真正的程序员。 回答1 表达式的求值顺序通常是undefined 。 (C 和 C++ 的方式相同
  • 2019年第十届C/C++ B组蓝桥杯省赛真题
    这里是蓝桥杯历年的题目专栏,将会陆续更新将往年真题以及解答发布出来,欢迎各位小伙伴关注我吖,你们的点赞关注就是给我最好的动力!!! 每天更新一届真题解析,敬请期待 蓝桥杯历年真题及详细解答 目录 第一题:组队(5分)第二题:年号字符(5分)第三题:数列求值(10分)第四题:数的分解(10分)第五题:迷宫(15分)第六题:特别数的和(15分)第七题:完全二叉树的权值(20分)第八题:等差数列(20分)第九题:后缀表达式(25分)第十题:灵能传输(25分) 第一题:组队(5分) 题目描述 作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员, 组成球队的首发阵容。 每位球员担任 1号位至 5号位时的评分如下表所示。请你计算首发阵容 1 号位至5号位的评分之和最大可能是多少? 数据 1 97 90 0 0 0 2 92 85 96 0 0 3 0 0 0 0 93 4 0 0 0 80 86 5 89 83 97 0 0 6 82 86 0 0 0 7 0 0 0 87 90 8 0 97 96 0 0 9 0 0 89 0 0 10 95 99 0 0 0 11 0 0 96 97 0 12 0 0 0 93 98 13 94 91 0 0 0 14 0 83 87 0 0 15 0 0 98 97 98 16 0 0 0 93 86 17 98 83 99 98 81
  • 调用函数对象时如何保证参数求值的顺序?(How to guarantee order of argument evaluation when calling a function object?)
    问题 关于在使用std :: make_tuple时如何避免构造函数执行顺序不确定的问题的答案引发了讨论,在此期间,我了解到可以保证构造函数的参数求值顺序:使用大括号初始化列表保证从左到右: T{ a, b, c } 表达式a , b和c以给定的顺序求值。 即使类型T仅定义了普通的构造函数,也是如此。 显然,并不是所有被调用的东西都是构造函数,有时在调用函数时最好保证求值顺序,但是没有大括号参数列表这样的函数可以对参数的求值顺序进行定义。 问题就变成了:构造函数的保证是否可以用于构建函数调用工具(“ function_apply() ”),并带有对参数求值的顺序保证? 要求调用一个函数对象是可以接受的。 回答1 像这样一个愚蠢的包装类呢? struct OrderedCall { template <typename F, typename ...Args> OrderedCall(F && f, Args &&... args) { std::forward<F>(f)(std::forward<Args>(args)...); } }; 用法: void foo(int, char, bool); OrderedCall{foo, 5, 'x', false}; 如果需要返回值,则可以通过引用将其传递(您需要一些特征来提取返回类型),或将其存储在对象中,以获得类似以下的接口: