[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bep] learning lisp: while



 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)
**-***-***-***-***-***-***-***-***-***-***-***-**