【问题标题】:DrRacket recursive functionDrRacket 递归函数
【发布时间】:2023-03-04 23:39:01
【问题描述】:

我是球拍编程语言的新手,所以为了快速测试,我在 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。我不确定发生了什么。我究竟做错了什么?非常感谢任何帮助,并在此先感谢您!

【问题讨论】:

    标签: recursion racket


    【解决方案1】:

    刚刚尝试了一种不同的方法,并且似乎产生了结果:

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

    这打印了 54321,这是我预期的行为。不太确定为什么会这样,但以前的尝试没有,但如果有人能阐明这个话题,那将不胜感激!

    【讨论】:

    • 之所以有效,是因为您在原始代码中使用了(print k) 而不仅仅是k。这就像说if(true) { x; return y; } else z;,在这段代码中,y 被返回,但x 绝对什么都不做。 (if #t (begin x y) z) 的工作方式完全相同。
    【解决方案2】:

    如果你想让它显示在控制台上,你必须显式打印这个值,否则k 的行什么都不做 - 请记住,Scheme 的核心是函数式编程语言,并且条件返回 last 表达式的值,所有其他的只是执行效果,但不返回值。一些提示:

    (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)
    

    【讨论】:

      猜你喜欢
      • 2017-03-22
      • 2016-03-14
      • 2015-03-01
      • 2010-12-23
      • 1970-01-01
      • 2010-12-25
      • 2023-04-02
      相关资源
      最近更新 更多