[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bep] learning lisp: while
- To: bep@argv.org
- Subject: Re: [bep] learning lisp: while
- From: Reiko TAKAHASHI <HFC03614@nifty.ne.jp> (高橋玲子)
- Date: Thu, 28 Jun 2001 13:35:02 +0900
- Delivered-To: mailing list bep@argv.org
- Mailing-List: contact bep-help@argv.org; run by ezmlm
r高橋です。
Reply TAKAHASHI Naoto <ntakahas@...>'s message:
} > (defun fact (n)
} > (setq s 1)
} > (when (and (integerp n) (>= n 1))
} > (while (>= n 1)
} > (setq s (* s n))
} > (setq n (- n 1)))
} > s))
}
} 全体的には合ってますが、これだとグローバル変数の s に値を代入してしま
} いますから、全体を let で囲んで s をローカルにした方がいいでしょう。あ
sに束縛された値が残ってしまわないように、ということですね。全然考えてい
なかった……。
} と掛算だから変数名は s よりも p の方がわかりやすいかもしれません。また
……productのpですね。sはsumでしょうか。こちらも全然考えていませんでし
た。
} 細かいことですが、ある数に1をかけても同じですから、(>= n 1) は (> n 1)
} とするとループを一回減らせます。
あっ、そうですよね! 書いていたときは、「もしかして必要ないかもしれな
いけど、念のため……」とか思っていたのですが、プログラムなんだから、念の
ためは無駄になってしまいますね。
} (defun fact (n)
} (when (and (integerp n) (>= n 1))
} (let ((p 1))
} (while (> n 1)
} (setq p (* p n)
} n (1- n)))
} p)))
なるほど、わかりました。ありがとうございます。
} 今までだまっていましたが、
}
} (setq a 1)
} (setq b 2)
}
} は
}
} (setq a 1 b 2)
}
} とまとめられます。まとめなくても構いません。読みやすさが優先です。
並べて書くものでも、意味的に並列というか、近いものはまとめて、そうでな
いものは別にするとわかりやすそうですね。
} > でしょうか? (setq s 1) が最初思いつけなくて、ちょっと悩みました。
}
} そうですね。sigma をまねして (setq s 0) とやっちゃうと、何回ループを回っ
} ても0のままですからね。
実は私は、初めにsを(setq)すること自体を思いつけませんでした。というか、
0だったら設定しなければならないけれど、なぜか、1だったら設定しなくてもい
いみたいな気分になっていて……今考えるとどうしてそんなことを思ったのかわ
からないのですが。
一つ不思議だなと思ったのは、なにかの関数を実行したあと、(私はグローバ
ル変数でやってしまったので)それぞれの変数を評価すると数字が表示されるの
ですが、nはエラーになりますよね……? なぜnには数が残らないのでしょう?
} はい、これも合っているようです。かなり慣れてきましたね。
でも、考えるのにはすごく時間が掛かります(^^;)。さっと書けるようになった
ら、もっともっとおもしろそうなのですが。
**-***-***-***-***-***-***-***-***-***-***-***-**
Reiko TAKAHASHI (高橋玲子)
E-mail: HFC03614@...
ICQ UIN: 85924121 (Twinkle)
**-***-***-***-***-***-***-***-***-***-***-***-**