按题面二阶递推式记忆化递归求 Hermite 多项式,结果补两位小数输出。
OJ: roj
题目 ID: 1165
难度:入门
标签:数学递推递归记忆化搜索python
创建: 2026-09-29 21:38
更新: 2026-10-05 04:05
题目描述
用递归的方法求 Hermite 多项式的值:
给定正整数
输入:两个数
样例输入:1 2,样例输出:4.00。
思路
按递推式递归计算,用 memo 数组记录每个 .00 输出即可避开浮点误差。
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 21:38
# update_at: 2026-09-29 21:38
import sys
from functools import cache
@cache
def hermite(n: int, x: int) -> int:
"""返回 Hermite 多项式的值 h_n(x),由 h_0=1、h_1=2x 两条边界递推。"""
if n < 2:
return 1 if n == 0 else 2 * x
return 2 * x * hermite(n - 1, x) - 2 * (n - 1) * hermite(n - 2, x)
def solve() -> None:
n, x = map(int, sys.stdin.buffer.read().split())
value = hermite(n, x)
# 输出恰好两位小数:x 是整数,h_n(x) 必为整数,拼接 ".00" 即可。
# 不用 f"{value:.2f}",那会先转成 float,大整数时会丢掉低位数字。
print(f"{value}.00")
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-09-29 21:45
* update_at: 2026-10-05 04:05
*/
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
ll n, x;
// 记忆化数组:memo[i] 表示 h_i(x) 的值,0 表示尚未计算。
// 本题 n <= 10,用 ll 足够。
ll memo[15];
// 按题面二阶递推式递归求 Hermite 多项式 h_n(x)
ll hermite(ll k) {
if (memo[k] != 0) return memo[k];
if (k == 0) return memo[k] = 1;
if (k == 1) return memo[k] = 2 * x;
return memo[k] = 2 * x * hermite(k - 1) - 2 * (k - 1) * hermite(k - 2);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> x;
ll ans = hermite(n);
// 结果必为整数,按要求补两位小数输出,避免浮点精度问题。
cout << ans << ".00" << endl;
return 0;
}