Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 反转给定整数方案的顺序_Recursion_Scheme_Racket - Fatal编程技术网

Recursion 反转给定整数方案的顺序

Recursion 反转给定整数方案的顺序,recursion,scheme,racket,Recursion,Scheme,Racket,在Scheme(Dr Racket)中,我被赋予了一项任务,按照给定数字的顺序倒序。解决方案应该是递归的,这就是我到目前为止得到的结果。。 事实是,我不太确定给定的算法是否有效,因为我得到: “适用:非程序; 应为可应用于参数的过程“ 每次运行时都会出错。。 在这个问题上有什么想法或帮助吗 (define reverse-digits (lambda (n) (if (> n 9) (+ (* 10 (modulo n 10)) (reverse-d

在Scheme(Dr Racket)中,我被赋予了一项任务,按照给定数字的顺序倒序。解决方案应该是递归的,这就是我到目前为止得到的结果。。 事实是,我不太确定给定的算法是否有效,因为我得到: “适用:非程序; 应为可应用于参数的过程“ 每次运行时都会出错。。 在这个问题上有什么想法或帮助吗

(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