【问题标题】:Recursion in DrracketDrracket 中的递归
【发布时间】:2017-03-22 20:11:25
【问题描述】:

我被要求编写一个球拍函数 repeat-str,它使用长度为 n 的字符串 s,并生成一个长度为 n 的新列表。如果 n 为 0,则生成空列表。如果 n 大于 0,则列表中的第一个字符串包含 n 的 n 个副本,第二个将是 n-1,因此是第四个。

例如:(repeat-str "cat") => (list "catcatcat" "catcat" "cat")

我有什么:

(define (repeat-str s)
   (cond
    [(zero? (string-length s)) empty]
    [(equal? (string-length s) 1) s]
    [else (make-list (string-length s) s)
          (repeat-str (make-list (sub1 (string-length s)) s))]))

我正在尝试调用在第二个列表中获取 n-1 的函数,但我不确定如何执行递归部分。这样我就可以获得 3 个单独的列表,然后将它们全部附加到最后。

** 不能使用: - 占位符函数
- 拉姆达 - 复制功能

使用带有列表缩写的初学者

谢谢。

【问题讨论】:

  • 在闭包中使用s 创建一个辅助函数,并以n 作为参数,这样您就可以知道字符串中有多少副本以及何时停止。然后就使用它。

标签: recursion racket


【解决方案1】:

也可以使用for/list 和可用的内置函数:

(define (f s)
  (reverse
   (for/list ((i (string-length s)))
     (apply string-append (make-list (add1 i) s)))))

测试:

(f "cat")

输出:

'("catcatcat" "catcat" "cat")

【讨论】:

    【解决方案2】:

    这是一种方法:

    (define (repeat-str str)
      (define (sub cnt rep)
        (if (zero? cnt)
            null
            (cons rep (sub (- cnt 1) (string-append rep str)))))
      (reverse (sub (string-length str) str)))
    

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2016-03-14
      • 2018-05-27
      • 1970-01-01
      • 2014-02-01
      • 2012-02-16
      • 2012-06-13
      • 2014-10-31
      • 2013-06-19
      相关资源
      最近更新 更多