Recursion 递归乘法

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

当第二个数字(在本例中为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 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