计算机软件能力认证考试系统
问题描述
试题编号: | 202309-3 |
试题名称: | 梯度求解 |
时间限制: | 1.0s |
内存限制: | 512.0MB |
问题描述: | 背景 梯度下降算法中,求解函数在一点处对某一自变量的偏导数是十分重要的。小 C 负责实现这个功能,但是具体的技术实现,他还是一头雾水,希望你来帮助他完成这个任务。 问题描述 求算多元函数在一点处对某一自变量的偏导数的方法是:将函数的该自变量视为单一自变量,其余自变量认为是常数,运用一元函数求导的方法求出该偏导数表达式,再代入被求算的点的坐标即可。 例如,要求算 u=x1⋅x1⋅x2 对 x1 在 (1,2) 处的偏导数,可以将 x2 视为常数,依次应用求导公式。先应用乘法的求导公式:(x1⋅(x1⋅x2))′=x1′(x1⋅x2)+x1(x1⋅x2)′;再应用常数与变量相乘的求导公式,得到 x1′⋅x1⋅x2+x1⋅x2⋅x1′;最后应用公式 x′=1 得到 1⋅x1⋅x2+x1⋅x2⋅1。整理得 ∂u∂x1=2x2⋅x1。再代入 (1,2) 得到 ∂u∂x1(1,2)=4。 常见的求导公式有: (是常数)c′=0 (c是常数) x1; 输入的第一行是由空格分隔的两个正整数 n、m,分别表示要求解函数中所含自变量的个数和要求解的偏导数的个数。 输入的第二行是一个逆波兰式,表示要求解的函数 f。其中,每个元素用一个空格分隔,每个元素可能是: 一个自变量 xi,用字符 x 后接一个正整数表示,表示第 i 个自变量,其中 i=1,2,…,n。例如,x1 表示第一个自变量 x1。 输出格式 输出 m 行,每行一个整数,表示对应的偏导数对 109+7 取模的结果。即若结果为 y,输出为 k,则保证存在整数 t,满足 y=k+t⋅(109+7) 且 0≤k<109+7。 样例 1 输入 样例 1 输出 样例 1 说明 对 x1 求偏导得 ∂u∂x1=3x12+x2。代入 (2,3) 得到 ∂u∂x1(2,3)=15。 对 x2 求偏导得 ∂u∂x2=x1。代入 (3,4) 得到 ∂u∂x2(3,4)=3。 样例 2 输入 样例 2 输出 样例 2 说明 因为 u 中实际上不含 x1 和 x3,对这两者求偏导结果均为 0。 对 x2 求偏导得 ∂u∂x2=3x22−1010。 评测用例规模与约定 当计算整数 n 对 M 的模时,若 n 为负数,需要注意将结果调整至区间 [0,M) 内。 |
参考来源:第31次CCF计算机软件能力认证 - ~Lanly~ - 博客园 (cnblogs.com)
从题目中可以看逆波兰式就是表达树的后序遍历,所以我们可以利用二叉树的递归遍历进行求解。
同时,我们可以利用vector向量建立二叉树,用链表也行,但是会比较麻烦。
具体请看代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include