Recursion DrRacket递归函数

Recursion DrRacket递归函数,recursion,racket,Recursion,Racket,我是racket编程语言的新手,所以作为一个快速测试,我在DrRacket上输入了以下内容: >(define (test k) (when (not (= k 0)) (begin k (test (- k 1))))) >(test 5) 我预期的产出是: 54321 但是却没有得到任何回报 尝试了另一种方法: >(define (test k) (when (not (= k 0)) (begin (test (- k 1)) k

我是racket编程语言的新手,所以作为一个快速测试,我在DrRacket上输入了以下内容:

>(define (test k)
 (when (not (= k 0))
  (begin
   k
    (test (- k 1)))))
>(test 5)
我预期的产出是: 54321

但是却没有得到任何回报

尝试了另一种方法:

>(define (test k)
  (when (not (= k 0))
   (begin
     (test (- k 1)) k)))
>(test 5)

但这只印了数字5。我不知道发生了什么事。我做错了什么?非常感谢您的帮助,并提前向您表示感谢

只是尝试了一种不同的方法,似乎取得了效果:

> (define (prnt k) k)
> (define (test k)
 (when (not (= k 0))
  (begin
   (print k)
    (test (- k 1)))))
> (test 5)

这是我预期的54321。不太清楚为什么这样做有效,但之前的尝试没有,但如果有人能够阐明这个主题,那将不胜感激

只是尝试了一种不同的方法,似乎取得了效果:

> (define (prnt k) k)
> (define (test k)
 (when (not (= k 0))
  (begin
   (print k)
    (test (- k 1)))))
> (test 5)
这是我预期的54321。不太清楚为什么这样做有效,但之前的尝试没有,但如果有人能够阐明这个主题,那将不胜感激

如果希望在控制台上显示值,则必须显式打印该值,否则带有
k
的行将无所作为-请记住,Scheme的核心是一种函数式编程语言,条件返回最后一个表达式的值,所有其他行都只是为了实现此效果而执行,但不要返回值。以下几点提示:

(define (test k)
  (unless (zero? k)   ; use unless instead of when-not, zero? instead of (= x 0)
    (display k)       ; display prints in console
    (test (sub1 k)))) ; use sub1 instead of (- x 1)
如果希望在控制台上显示值,则必须显式打印该值,否则带有
k
的行将无所作为-请记住,Scheme的核心是一种函数式编程语言,条件返回最后一个表达式的值,所有其他行都只是为了效果而执行,但不要返回值。以下几点提示:

(define (test k)
  (unless (zero? k)   ; use unless instead of when-not, zero? instead of (= x 0)
    (display k)       ; display prints in console
    (test (sub1 k)))) ; use sub1 instead of (- x 1)

这是因为您使用的是
(print k)
,而不是原始代码中的
k
。这就像说
if(true){x;返回y;}else z
,在此代码中,
y
返回,但
x
完全不执行任何操作<代码>(如果#t(begin x y)z)的工作方式完全相同。这是因为您在原始代码中使用的是
(print k)
,而不仅仅是
k
。这就像说
if(true){x;返回y;}else z
,在此代码中,
y
返回,但
x
完全不执行任何操作
(如果#t(开始x y)z)
的工作方式完全相同。