LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 912|回复: 12

刚接触scheme,被一道超简单题整懵了:

[复制链接]
发表于 2005-6-25 17:19:05 | 显示全部楼层 |阅读模式
An iterative version of odd? for non-negative integer arguments can be written using and, or, and not. To do so, you have to take advantage of the fact that and and or are special forms that evaluate their arguments in order from left to right, exiting as soon as the value is determined. Write (boolean-odd? x) without using if or cond, but using and, or, not (boolean) instead. You may use + and -, but do not use quotient, remainder, /, etc.

脑子里总跳出if,没if怎么办?总觉我在哪里有概念性的错误,否则应该是几秒钟做出来的。
发表于 2005-6-25 20:21:07 | 显示全部楼层
概念问题。
and表达式如果左边是假,就不需要对右边求值。
or表达式如果左边是真,也不需要对右边求值。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-25 20:39:02 | 显示全部楼层
这个我清楚。关键是只能用and、or、+、-来判断是否为奇数,不能用if,而且还是迭代算法!
回复 支持 反对

使用道具 举报

发表于 2005-6-25 20:55:16 | 显示全部楼层
形式问题。你先用if把程序写出来。然后再改写成不用if的形式。
回复 支持 反对

使用道具 举报

发表于 2005-6-25 21:45:40 | 显示全部楼层
只用了+和!以及迭代。for的结束条件事实上还是使用了判断语句。另外,效率很低。
不过如果允许下面的思路的话,效率可以改进

  1. bool is_it_odd( N )
  2. {
  3.     bool isodd=true;
  4.     int i;
  5.     for(i=0;i<=N;i++)isodd=!isodd;
  6.     return isodd;
  7. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-6-25 21:49:29 | 显示全部楼层
!@#¥@%
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-26 13:55:28 | 显示全部楼层
这是道教学题,是mit的6.001课程里的一道,出题者的用意是让学生知道iterative程序的特点,但是怎么想,iterative都必须有一个判断啊,否则怎么结束呢?如果能用bool型的变量,一步就ok了,但不是iterative程序。越来越觉得题目有问题!
回复 支持 反对

使用道具 举报

发表于 2005-6-26 16:43:58 | 显示全部楼层
怎么需要判断呢?逻辑电路里面的基本门就没有if门,只有and,or not门,照样完成了所有逻辑运算
回复 支持 反对

使用道具 举报

发表于 2005-6-26 17:36:22 | 显示全部楼层

  1. (define (boolean-odd? x)
  2.        (or (= x 2)
  3.              (and (not (= x 1)) (boolean-odd? (- x 2)) #t)))
复制代码

似乎没有说不能用 = 号吧   :ask  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-26 18:36:01 | 显示全部楼层
楼上的编了一个even?,不过还是很感谢的说,看来不是概念错误,而是思想错误了! :thank
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表