只用“+”“-”“if0”"with"(代入)这几个操作定义一个乘法操作,和判断一个数是正是负

direren 2011-02-03 02:09:22
可用操作有
“+”
“-”
“if0”这个操作的意思是:

the if0 conditional expression

To compute the value of the expression {if0 test-expr yes-expr no-expr}, first evaluate the test-expr. If it has the value 0, evaluate the yes-expr branch; otherwise, evaluate the no-expr branch. For example:

{if0 {+ 3 {+ -5 2}} {+ 8 9} {+ 5 6}}
should return 17.
就是说,这个操作判断的是 第一个表达式,如果第一个表达式结果为0的话,则最终结果为第二个表达式的值,如果第一个表达式结果为1的话,那么最终结果为第三个表达式的值。

“with”是代入操作,例如:(with (x 3) (with (y 9) (+ x y))) 先是把y = 9代入 +x y然后把 x=3代入

(1)如何用这几个操作定义一个乘法操作
(2)如何用这几个操作定义一个判断一个数是正是负的操作

可以定义其他的辅助操作,但是辅助操作也必须来自于这四种操作,
例如我定义一个判断是否相等的操作: (deffun (equal? x y)(if0 (- x y) 0 1))

能提供思路即可,不是要用特定的语言,只求怎么能通过这四种简单的操作,来定义两个其他的操作
...全文
167 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
direren 2011-02-11
  • 打赏
  • 举报
回复
谢谢你的帮助,[Quote=引用 6 楼 hpsmouse 的回复:]
引用 5 楼 direren 的回复:

现在在线吗,想问你问题

用手机上网是一件很纠结的事情……
[/Quote]
2011-02-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 direren 的回复:]

现在在线吗,想问你问题
[/Quote]
用手机上网是一件很纠结的事情……
direren 2011-02-05
  • 打赏
  • 举报
回复
现在在线吗,想问你问题[Quote=引用 4 楼 hpsmouse 的回复:]
引用 3 楼 direren 的回复:
为什么会有计算溢出?


判断正负号的时候我是往两边搜索,如果这个数的绝对值太大,运行环境又没有使用高精度整数的话,是有可能溢出的。不过似乎不影响判断结果。

当时也只是感觉好像有溢出问题,就随手写了一句,别当真~~

我在测试的时候倒是把栈爆了好几次……我的 GNU clisp 竟然没有尾递归优化……
[/Quote]
direren 2011-02-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hpsmouse 的回复:]
这问题还是去函数式编程的版块问比较靠谱……

下面这段代码我也没试过对不对,就当灌水了……
用了一种极其丑陋且低效的办法来判断正负号……

不考虑浮点,只考虑整数,而且不考虑整数计算溢出的情况。

(deffun (non-negative-helper pos-dir neg-dir)
(if0 neg-dir 0
(if0 pos-dir 1
(non-nega……
[/Quote]为什么会有计算溢出?
2011-02-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 direren 的回复:]
为什么会有计算溢出?
[/Quote]

判断正负号的时候我是往两边搜索,如果这个数的绝对值太大,运行环境又没有使用高精度整数的话,是有可能溢出的。不过似乎不影响判断结果。

当时也只是感觉好像有溢出问题,就随手写了一句,别当真~~

我在测试的时候倒是把栈爆了好几次……我的 GNU clisp 竟然没有尾递归优化……
2011-02-03
  • 打赏
  • 举报
回复
这问题还是去函数式编程的版块问比较靠谱……

下面这段代码我也没试过对不对,就当灌水了……
用了一种极其丑陋且低效的办法来判断正负号……

不考虑浮点,只考虑整数,而且不考虑整数计算溢出的情况。

(deffun (non-negative-helper pos-dir neg-dir)
(if0 neg-dir 0
(if0 pos-dir 1
(non-negative-helper (+ pos-dir 1) (- neg-dir 1))
)
)
)

(deffun (non-negative x) (non-negative-helper x x))

(deffun (pos-mul x y sum)
(if0 y sum
(pos-mul x (- y 1) (+ sum x))
)
)

(deffun (neg-mul x y sum)
(if0 y sum
(neg-mul x (+ y 1) (- sum x))
)
)

(deffun (mul x y) (if0 non-negative (pos-mul x y 0) (neg-mul x y 0)))

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧