作者: 機械伯爵
日時: 2003/4/24(12:09)
 機械です。

> この func を Scheme で書くと
> 
> (define (func x)
>   (if (zero? x)
>       0
>       (+ 5 (func (- x 1))))) ; 末尾再帰でない!!
> 
> となります.Scheme の実装の 1 つ SCM の場合,
> x = 1000000 を与えるとセグメンテーション違反になりました.
> guile でも Stack overflow になります.

 私はこう書きました。

(define (f x)(if (= x 0)0(+ 5 (f (- x 1)))))

 zero?を使ってないだけで、ほぼ同じですが、
Chez Schemeにかけたら、(f 1000000)でも大丈夫
だったので、良かったのかな? と思ったのですが、
末尾再帰じゃなかったんですね・・・(汗)

> python で書くなら
> # 動作確認出来ませんので間違っているかも...
> 
> def foo(x, y):
>     if x == 0:
>        return y
>     else:
>        return foo(x - 1, 5 + y)
> 
> def func(x):
>     return foo(x, 0)
> 
> と言う感じでしょうか.

 え〜実験しましたところ、通常実装でも、
Stacklessでも、大きすぎる数値では暴走
しました。

 結果としては、StacklessPythonでSchemeの
真似はできないようです。

※PythonでSchemeを書けば別でしょうが。

/機械伯爵/