Recursion 反转给定整数方案的顺序
在Scheme(Dr Racket)中,我被赋予了一项任务,按照给定数字的顺序倒序。解决方案应该是递归的,这就是我到目前为止得到的结果。。 事实是,我不太确定给定的算法是否有效,因为我得到: “适用:非程序; 应为可应用于参数的过程“ 每次运行时都会出错。。 在这个问题上有什么想法或帮助吗Recursion 反转给定整数方案的顺序,recursion,scheme,racket,Recursion,Scheme,Racket,在Scheme(Dr Racket)中,我被赋予了一项任务,按照给定数字的顺序倒序。解决方案应该是递归的,这就是我到目前为止得到的结果。。 事实是,我不太确定给定的算法是否有效,因为我得到: “适用:非程序; 应为可应用于参数的过程“ 每次运行时都会出错。。 在这个问题上有什么想法或帮助吗 (define reverse-digits (lambda (n) (if (> n 9) (+ (* 10 (modulo n 10)) (reverse-d
(define reverse-digits
(lambda (n) (if (> n 9)
(+ (* 10 (modulo n 10)) (reverse-digits (quotient n 10)))
(n))))
(reverse-digits 1234)
这是一个硬件作业,所以我不会给你代码 你的问题是将
(模n10)
乘以10并不能得到你需要的位置。考虑<代码>(反向数字123)< /代码>:
你想要的是,根据数字的长度,每次乘以不同的10次方。您可以创建一个计算数字长度的函数(可能是通过重复将数字除以10,并记录它执行此操作的次数),或者传递数字的长度(可能通过创建另一个函数,该函数将数字n
作为参数并计算长度,然后将其传递给您的函数,然后该函数将从每次递归调用的长度中减去1
然后你会得到这样的结果:
(reverse-digits 123)
(+ 300 (reverse-digits 12))
(+ 300 (+ 20 (reverse-digits 1)))
(+ 300 (+ 20 1))
321
你所得到的错误是因为在你的else案例中,你做了
(n)
。因为n
不是一个过程,你会得到一个错误。你只是想要n
。你一定要使用特定的过程吗?如果不是,有一个替代方法来使用模和添加数字。这是关于使用列表过程,例如
number->string
take
list->string
等等
这是我的解决方案,它不是非常有效
(define
invert-number-aux (λ (n res)
(if (empty? n) res
(invert-number-aux
(take n (-(length n) 1)) ;new n
(append res (list (last n))) ;new res
)
)))
(define
invert-number (λ (n)
(string->number (list->string (invert-number-aux (string->list(number->string n)) '())))
))
使用较小的辅助函数会很有帮助 以下是将任务拆分为较小部分的一种方法:
; number->digits : natural -> list-of-digits
(define (number->digits n)
...)
; digits->number : list-of-digits -> natural
(define (number->digits n)
...)
使用这些帮助程序,您可以编写:
(define (reverse-number x)
(digits->number
(reverse
(number->digits x))))
另外-如果您想将错误“应用程序:不是过程;应为可应用于参数的过程”替换为(n)
如果您在DrRacket中运行程序,应用程序
(n)
应该是红色的。问题是(42)
意味着计算42,然后像调用函数一样调用结果。因为42是一个数字,所以会出现错误。重要的是要理解fixNum并不是只有一个表示形式,数字的不同数字可能会随着其表示形式的基础而改变。以下是我对它的理解
(define (number->digits number (base 10))
(let loop ((n number) (acc '()))
(if (zero? n)
acc
(let-values (((res rem) (quotient/remainder n base)))
(loop res (cons rem acc))))))
(define (list->number lst (base 10))
(foldl (lambda (x acc)
(+ (* acc base) x))
0
lst))
(define (reverse-digits number (base 10))
(list->number (reverse (number->digits number base))
base))
(number->string (reverse-digits #b100111 #b10) #b10) ; ==> "111001" (or 39 => 57 in base 10)
(number->string (reverse-digits #xebabefac #x10) #x10) ; ==> "cafebabe" (or 3953913772 => 3405691582 in base 10)
(number->string (reverse-digits 1234)) ; ==> 4321
你得到
应用程序的原因:不是一个过程是因为你把n
放在括号里,这意味着你试图调用n
作为一个函数。是的,你完全正确。不知道我怎么会错过它。谢谢!
(define (number->digits number (base 10))
(let loop ((n number) (acc '()))
(if (zero? n)
acc
(let-values (((res rem) (quotient/remainder n base)))
(loop res (cons rem acc))))))
(define (list->number lst (base 10))
(foldl (lambda (x acc)
(+ (* acc base) x))
0
lst))
(define (reverse-digits number (base 10))
(list->number (reverse (number->digits number base))
base))
(number->string (reverse-digits #b100111 #b10) #b10) ; ==> "111001" (or 39 => 57 in base 10)
(number->string (reverse-digits #xebabefac #x10) #x10) ; ==> "cafebabe" (or 3953913772 => 3405691582 in base 10)
(number->string (reverse-digits 1234)) ; ==> 4321