C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: lispの大域変数、局所変数について


(過去ログ 86 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■51387 / inTopicNo.1)  lispの大域変数、局所変数について
  
□投稿者/ もふ (1回)-(2010/07/03(Sat) 23:59:58)

分類:[その他の言語] 

Allegro Common Lisp 8.0を使っています。

以下のような問題があります。

2つのリストx,yを結合して新しいリストzを作り、zの要素の個数kをzの先頭に追加したリストを値とする関数concat(x,y)を定義する。
ただし、リストを連結する関数myappend(x,y)、要素の個数を求める関数mylength(z)を定義しておき、concatで使用する。

/*実際にはzはconcat関数の中間データになるため、大域変数zにバインドしてはいけない。
このような局所的な値の一時保存にはlet式を使う。*/


/*〜*/の部分がよくわかりません。
つまり、作ったリストzをconcatによって、変化させてはいけないということなのでしょうか?
 (defun concat (x y)
    (cons (mylength (myappend x y)) (myappend x y)))
というようにしても問題がないように思いますが・・・

ご教授願います。
言っていることが分からなかったらすみません。


引用返信 編集キー/
■51391 / inTopicNo.2)  Re[1]: lispの大域変数、局所変数について
□投稿者/ れい (946回)-(2010/07/04(Sun) 10:28:49)
No51387 (もふ さん) に返信
> Allegro Common Lisp 8.0を使っています。

おや珍しい。

> /*〜*/の部分がよくわかりません。
> つまり、作ったリストzをconcatによって、変化させてはいけないということなのでしょうか?

いいえ。
作ったリストzは外部から見えないということです。
なので、concatが終えれば要らないと判断できるので、すぐに廃棄されます。
また、外部でzが定義されていたときに、そのzを破壊しなくなります。

> (defun concat (x y)
> (cons (mylength (myappend x y)) (myappend x y)))
> というようにしても問題がないように思いますが・・・

バグは無いのでそれをもって問題がないというなら問題はありません。

ですが、明らかに計算量の無駄ですよね?

何の問題なのか知りませんが、教育的配慮なのではありませんか?
問題に「新しいリストzを作り」とあるということはzを作れということです。
letを覚えろ、と。


引用返信 編集キー/
■51401 / inTopicNo.3)  Re[2]: lispの大域変数、局所変数について
□投稿者/ もふ (2回)-(2010/07/04(Sun) 17:54:01)
No51391 (れい さん) に返信
> ■No51387 (もふ さん) に返信

返信ありがとうございます。
/*〜*/の部分の意味がやっと分かりました。

私が作ったプログラムは確かに無駄な計算をしていました・・・
let式を使った場合は、下のようなプログラムで大丈夫ですよね・・・?

(defun concat (x y)
  (let ((z (myappend x y)))
       (cons (mylength z) z)))

引用返信 編集キー/
■51402 / inTopicNo.4)  Re[3]: lispの大域変数、局所変数について
□投稿者/ もふ (3回)-(2010/07/04(Sun) 17:54:18)
2010/07/04(Sun) 17:57:45 編集(投稿者)

間違って、2回投稿してしまいました。
すみません。
引用返信 編集キー/
■51408 / inTopicNo.5)  Re[3]: lispの大域変数、局所変数について
□投稿者/ れい (947回)-(2010/07/04(Sun) 21:52:29)
No51401 (もふ さん) に返信
> ■No51391 (れい さん) に返信
>>■No51387 (もふ さん) に返信
>
> 返信ありがとうございます。
> /*〜*/の部分の意味がやっと分かりました。
>
> 私が作ったプログラムは確かに無駄な計算をしていました・・・
> let式を使った場合は、下のようなプログラムで大丈夫ですよね・・・?

大丈夫かどうかは実行していろいろいじってみるべきでしょう。
私が「大丈夫!」と言っても何の保証にもなりませんので。

ついでにもうひとつ。

> ただし、リストを連結する関数myappend(x,y)、要素の個数を求める関数mylength(z)を定義しておき

とあるのでmyappendもmylengthも定義しないといけないのかもしれません。
引用返信 編集キー/
■51417 / inTopicNo.6)  Re[4]: lispの大域変数、局所変数について
□投稿者/ もふ (4回)-(2010/07/05(Mon) 10:31:52)
2010/07/05(Mon) 10:34:30 編集(投稿者)
2010/07/05(Mon) 10:34:06 編集(投稿者)

<pre><pre>■No51408 (れい さん) に返信
> ■No51401 (もふ さん) に返信
>>■No51391 (れい さん) に返信
> >>■No51387 (もふ さん) に返信
>>  ■No51408 (れい さん) に返信
問題解決です。
分かりやすく説明していただきありがとうございました。
自分でいろいろプログラムをいじってみて、プログラムを完成させたいと思います。
ありがとうございました^^</pre></pre>

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -