回答編集履歴
2
よりよい回答
    
        answer	
    CHANGED
    
    | 
         @@ -1,5 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            自己解決のような方法であれば、以下の方法がよいのではないかと思います。この質問見たときに思いついた方法ですが、もっとスマートな方法があるんじゃないかと思って出さずにいたものです。
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            **★ 下によりよい処理を追記しています。**
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
       3 
5 
     | 
    
         
             
            この方法も、すべて事前に定義しておかなければならないのでいまひとつだと思っています。
         
     | 
| 
       4 
6 
     | 
    
         
             
            高階関数を使ってうまく再帰定義できる方法があるといいんですが。
         
     | 
| 
       5 
7 
     | 
    
         
             
            だれかわかるひといませんかー。
         
     | 
| 
         @@ -42,4 +44,57 @@ 
     | 
|
| 
       42 
44 
     | 
    
         
             
                u.append(lambda t, j=i: u[j - 1](t) + 1)
         
     | 
| 
       43 
45 
     | 
    
         
             
            ```
         
     | 
| 
       44 
46 
     | 
    
         | 
| 
       45 
     | 
    
         
            -
            いずれの場合も、定義のところでiをjに置き換えているところがポイントです。iのまま使うと、定義の中のiがすべてループの最終値になってしまいます。
         
     | 
| 
      
 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 
     | 
    
         
            +
            これをやらないと、成立しません。
         
     | 
1
訂正
    
        answer	
    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式を使うと少しすっきりします。
         
     |