回答編集履歴

2

よりよい回答

2022/08/26 10:21

投稿

TakaiY
TakaiY

スコア12774

test CHANGED
@@ -1,4 +1,6 @@
1
1
  自己解決のような方法であれば、以下の方法がよいのではないかと思います。この質問見たときに思いついた方法ですが、もっとスマートな方法があるんじゃないかと思って出さずにいたものです。
2
+
3
+ **★ 下によりよい処理を追記しています。**
2
4
 
3
5
  この方法も、すべて事前に定義しておかなければならないのでいまひとつだと思っています。
4
6
  高階関数を使ってうまく再帰定義できる方法があるといいんですが。
@@ -43,3 +45,57 @@
43
45
  ```
44
46
 
45
47
  いずれの場合も、定義のところでiをjに置き換えているところがポイントです。iのまま使うと、定義の中のiがすべてループの最終値になってしまいます。
48
+
49
+ ---
50
+
51
+ 漸化式で関数生成できないかと思って考えてみました。たぶん できています。
52
+
53
+ ```python
54
+ from functools import lru_cache
55
+
56
+ @lru_cache(maxsize=1000)
57
+ def gen_u(n):
58
+ if n == 0:
59
+ return lambda t: 2 * t
60
+ else:
61
+ return lambda t: gen_u(n - 1)(t) * (1- (integrate.quad(gen_u(n - 1), 0, 1)[0])**2 )
62
+
63
+ # 引数に数値を与えると、質問の関数相当のものを生成して返します
64
+ u3 = gen_u(3)
65
+ ```
66
+ lru_cacheはなんとなく付けたおまけです。
67
+ この関数はテストできませんでしたが、以下の簡略したもので確認しています。
68
+
69
+ ```python
70
+ from functools import lru_cache
71
+
72
+ @lru_cache(maxsize=1000)
73
+ def gen_u(n):
74
+ if n == 0:
75
+ return lambda t: 2 * t
76
+ else:
77
+ return lambda t: gen_u(n - 1)(t) + 1
78
+
79
+ u3 = gen_u(3)
80
+
81
+ print(u3(5))
82
+
83
+ print(gen_u(7)(5))
84
+ ```
85
+
86
+ ついでですが、もともとの要望であった「今ある関数を更新する」ということであれば、 こんな感じでしょうか。
87
+ これも高階関数です。
88
+
89
+ ```python
90
+ def u(t):
91
+ ans = t
92
+ return ans
93
+
94
+ for i in range(10):
95
+ print(u(5))
96
+ u = lambda t, c_f=u: c_f(t) + 1
97
+ print(u(5))
98
+ ```
99
+ ここでも、lambdaの引数に現行の関数(c_f)として渡しているところがポイントです。
100
+ これをやらないと、成立しません。
101
+

1

訂正

2022/08/26 02:11

投稿

TakaiY
TakaiY

スコア12774

test CHANGED
@@ -23,7 +23,7 @@
23
23
  ans = u[j - 1](t) + 1
24
24
  return ans
25
25
  u.append(tmpfn)
26
- ``
26
+ ```
27
27
  これで、`u[2](5) -> 7` となります。
28
28
 
29
29
  lambda式を使うと少しすっきりします。