Recursion 递归乘法
当第二个数字(在本例中为y)为负数时,代码不会给我答案,最终崩溃。所以Recursion 递归乘法,recursion,scheme,racket,Recursion,Scheme,Racket,当第二个数字(在本例中为y)为负数时,代码不会给我答案,最终崩溃。所以(递归乘法9-3)起作用,(递归乘法9-3)起作用,(递归乘法9-3)崩溃,(递归乘法9-3)崩溃 这是我的密码 (定义递归乘法 (λ(x y) (如果(=y 1) x (+x(递归乘以x(-y 1()()))) 如果y为负值,您的过程将永远持续下去,您可以通过将if更改为cond来解决此问题,该cond具有不同代码的条件,以便在y确实为负值时容纳负数 有问题的部分,(if(=y1)x(+x(RecursiveMultiply
(递归乘法9-3)
起作用,(递归乘法9-3)
起作用,(递归乘法9-3)
崩溃,(递归乘法9-3)
崩溃
这是我的密码
(定义递归乘法
(λ(x y)
(如果(=y 1)
x
(+x(递归乘以x(-y 1()())))
如果y为负值,您的过程将永远持续下去,您可以通过将if
更改为cond
来解决此问题,该cond具有不同代码的条件,以便在y确实为负值时容纳负数
有问题的部分,(if(=y1)x(+x(RecursiveMultiply x(-y1)))
基本上是说如果y是1,则返回x。如果y不是1,则在递减y后再次执行该过程。你的问题是,如果y是负数或零,它已经小于1了。从一个负数减去1/0只会使y离1越来越远,你永远不会真正达到1。您的过程卡在无限循环中,导致解释器崩溃
以下是解决问题的方法:
(define RecursiveMultiply
(lambda(x y)
(cond ((= y 1) x)
((= y 0) 0)
((< y 1) (* -1 (RecursiveMultiply x (- y))))
(else (+ x (RecursiveMultiply x (- y 1)))))))
尝试重新创建,但要使用过程。递归函数的结束条件是“(=y 1)” 但当y为负时,它永远不满足这个条件,它变成了一个无限循环 改变
(RecursiveMultiply x (- y 1))
到
欢迎来到美丽的Racket lang。注意#1:我不明白您为什么使用(定义f(lambda(参数)…)
而不是(定义(f参数)…)
。您还应该使用(sub1 y)
而不是(-y 1)
。此外,应将if
替换为cond
,这会更干净
问题很简单,当y
≠ 当y
为负数时,其值将无限期减小,从而创建一个无限循环,最终导致程序崩溃
注意#2:我已经清理了您的一些代码,如“注意#1”所述
解决这个问题的“专业”方法(大多数学校都教授)是创建一个辅助函数,或者只用于修改现有函数的函数
;; Our auxiliary function
(define (RecursiveMultiply* x y)
(cond
[(= y 1) x]
[else (+ x (RecursiveMultiply x (- y 1)))]))
(define (RecursiveMultiply x y)
(cond
;; Both "x" and "y" are negative, so change them both to positives
[(and (< x 0) (< y 0)) (RecursiveMultiply* (abs x) (abs y))]
;; "y" is negative, so it Plugs in a legal "y" value and multiplies it by -1 to be mathematically correct
;; We should be using * instead of the first "RecursiveMultiply", but it is obvious that you want to do this without it
[(< y 0) (RecursiveMultiply -1 (RecursiveMultiply* x (abs y)))]
[else (RecursiveMultiply* x y)]))
它甚至可以与0
一起使用
(RecursiveMultiply -11 0) ; 0
(RecursiveMultiply 0 15) ; 0
(RecursiveMultiply 0 0) ; 0
;; Our auxiliary function
(define (RecursiveMultiply* x y)
(cond
[(= y 1) x]
[else (+ x (RecursiveMultiply x (- y 1)))]))
(define (RecursiveMultiply x y)
(cond
;; Both "x" and "y" are negative, so change them both to positives
[(and (< x 0) (< y 0)) (RecursiveMultiply* (abs x) (abs y))]
;; "y" is negative, so it Plugs in a legal "y" value and multiplies it by -1 to be mathematically correct
;; We should be using * instead of the first "RecursiveMultiply", but it is obvious that you want to do this without it
[(< y 0) (RecursiveMultiply -1 (RecursiveMultiply* x (abs y)))]
[else (RecursiveMultiply* x y)]))
(RecursiveMultiply 9 3) ; 27
(RecursiveMultiply -9 3) ; -27
(RecursiveMultiply 9 -3) ; -27
(RecursiveMultiply -9 -3) ; 27
(RecursiveMultiply -11 0) ; 0
(RecursiveMultiply 0 15) ; 0
(RecursiveMultiply 0 0) ; 0