忍者ブログ
Yaleで、遊んで学ぶ日々。

Yaleで、遊んで学ぶ日々。

囲碁、ときどきプログラミング、ところにより経済。
[119]  [117]  [116]  [115]  [114]  [113]  [112]  [111]  [110]  [109]  [108
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

余談ですが、シェルスクリプトの関数って定義の中で自分を使えるんですね。出来そうだな、と思って実験してみたらやっぱりできました。
前の記事でも使っています。

下のtest.shというのがその例です。
funという関数を定義する中で、fun関数自身を使っています。
つまり、funを使おうと思ったらそのためにfunを使わなくてはいけなくって、またそのためにfunを使い、さらにまたそのために…ということになり、放っておくと永遠に処理が終わりません。
永遠の繰り返しを避けるために  if節を使って処理を2000回で終わらせています。この if節がなければ無限に数を数えつづける無限ループです。ハマってしまったら Ctrl+C で抜けだせます。


この例だと、funという関数は結局定義されず終いなんですよね。
自分の定義の中で自分を使ってしまっては、定義にならないのは当然です。
funという関数の実態はあやふやなまま、ただ「関数が呼ばれたらプログラムのこの場所へ移動」という動作だけがはっきりしています。

Pythonでまったく同じことを試してみたところ、繰り返しが1000を越えるとエラーが出ました。エラーの内容は、"RuntimeError: maximum recursion depth exceeded" だそうです。限られた回数なら定義内で自分を参照することが許されているというわけですね。確かに、終わりがちゃんと来るのであれば定義は曖昧ではありません。動的計画法で使うBellman Equationと同じです。Recursiveな定義も収束さえすれば定義たりうるというわけです。

これが手続き型とオブジェクト指向の違いなんでしょうか(違うかも)。
シェルスクリプトでは、関数は手順を示すものに過ぎませんが、pythonでは関数も1つのオブジェクトなので、実態があります。無限に自己参照を繰り返すオブジェクトは有効に定義されず、認められません(きっと1000回というのが無限と擬似される現実的な境目なのでしょう)。


人間のアイデンティティも同じで、多くの場合、自分の立ち位置を確認するためには他者を参照せざるをえません。自己完結は頑健なようで、案外脆いのかもしれません。



test.sh

#!/bin/sh

fun()
{
    if [ $1 -gt 1999 ]
    then
        return
    fi

    echo $1
    x=`expr $1 + 1`
    fun $x
}

fun 0




test.py

#!/usr/bin/env python 
# -*- coding: utf-8 -*-


def fun(x):
    if x > 999: # try 998 too
        return ""
   
    print x
    fun(x+1)
   
   
fun(0)



PR
この記事にコメントする
お名前:
タイトル:
文字色:
メールアドレス:
URL:
コメント:
パスワード:   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
Calender
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Search in This Blog
Latest Comments
[03/30 川内のばば山田]
[03/30 川内のばば山田]
[08/06 Aterarie]
[07/05 Agazoger]
[07/01 Thomaskina]
Oldest Posts
Latest Trackbacks
フリーエリア

Barcode
Access Analysis
Powerd by NINJAブログ / Designed by SUSH
Copyright © Yaleで、遊んで学ぶ日々。 All Rights Reserved.
忍者ブログ [PR]