Scheme 为什么可以';在这个函数中,我是否返回false,但我可以返回true?(球拍)

Scheme 为什么可以';在这个函数中,我是否返回false,但我可以返回true?(球拍),scheme,racket,Scheme,Racket,目标是检查非负数的数字是否按递增顺序排列 这是我的密码: (define (in-order-iter num) (define (aux num-left result-so-far) (cond ((equal? result-so-far #f) #f) ((< num-left 10) result-so-far) ((aux (quotient num-left 10) (< (modulo (quotient num-l

目标是检查非负数的数字是否按递增顺序排列

这是我的密码:

(define (in-order-iter num)
  (define (aux num-left result-so-far)
    (cond ((equal? result-so-far #f) #f)
          ((< num-left 10) result-so-far)
          ((aux (quotient num-left 10) (< (modulo (quotient num-left 10) 10)(modulo num-left 10))))))
  (aux num #t))

(in-order-iter 321)
仅此一项,它就返回
#f
,因此到目前为止它应该将
结果更改为
#f

为什么这会发生在我身上

编辑:顺便说一下,我可以递归地执行此函数,它可以工作:

(define (in-order-recur num)
  (if (> num 10)
      (if (< (modulo (quotient num 10) 10) (modulo num 10))
            (in-order-recur (quotient num 10))
            #f)
      #t))    

(in-order-recur 100000)
(定义(按重复次数的顺序)
(如果(>num 10)
(如果(<(模(商数10)10)(模数10))
(为了重现(商数10))
#(f)
#t) )
(为了重复10万次)

您应该使用
else
子句作为最后一个
条件
术语:

(define (in-order-iter num)
  (define (aux num-left result-so-far)
    (cond ((equal? result-so-far #f) #f)
          ((< num-left 10) result-so-far)
          (else (aux (quotient num-left 10) 
                     (< (modulo (quotient num-left 10) 10)
                        (modulo num-left 10))))))
  (aux num #t))
依赖于作为值返回的内容,例如MIT Scheme返回一些有用的值,会将您锁定在特定的方言中,并且不可移植


如果基本情况下的值为true,那么默认情况将为
#t
。然后,由于术语没有结果部分,
#t
是返回值。

谢谢!!我花了一分钟的时间才意识到这一点,但现在这很有意义。我想用我自己的话来总结一下:因此,如果表达式返回false,它将作为一个结果转到另一个语句——然而,由于没有其他语句存在,它返回void。但是,return#t没有任何后果,因为没有其他子句可返回。非常感谢。
(define (in-order-iter num)
  (define (aux num-left result-so-far)
    (cond ((equal? result-so-far #f) #f)
          ((< num-left 10) result-so-far)
          (else (aux (quotient num-left 10) 
                     (< (modulo (quotient num-left 10) 10)
                        (modulo num-left 10))))))
  (aux num #t))
(define (in-order-iter num)
  (define (aux num-left result-so-far)
    (cond ((equal? result-so-far #f) #f)
          ((< num-left 10) result-so-far)
          ((aux (quotient num-left 10) 
                (< (modulo (quotient num-left 10) 10)
                   (modulo num-left 10))))
          (else "BaNaNa")))
  (aux num #t))