【问题标题】:Scheme list of strings字符串方案列表
【发布时间】:2013-04-26 05:34:18
【问题描述】:

我在方案中的功能是这样的

(define (func1 input)
  (let kloop ((x 6))
    (let ((act (string-copy (func2 input2))))
      (if (eq? act "") (display "null") (display act))
      (if (> x 0) (kloop (- x 1)))))))

func2 返回一些存储在 act 中的字符串。现在我必须创建此函数返回的所有字符串的列表。在上面,我只是显示这些字符串。我尝试了不同的方法,但没有任何效果。我尝试使用 append 和 cons。

请提出建议。

【问题讨论】:

  • 什么是input2?为什么是string-copy(某些东西正在破坏性地修改func2的结果)?
  • 当然,显示某些内容与返回某些内容不同。显示产生对象的打印表示;返回返回对象。

标签: string list scheme


【解决方案1】:

您的最后一个if 缺少 else 情况,这是人们期望函数返回值的地方。

你没有提到你是如何尝试使用 appendcons 的,但是一个常见的模式是在循环中传递一个累加参数:

(define (five input)
  (let loop ((x 5) (outputs '()))
    (if (> x 0) 
        (loop (- x 1) (cons input outputs))
        outputs)))

> (five "yes")
'("yes" "yes" "yes" "yes" "yes")

【讨论】:

    【解决方案2】:

    您在input 上呼叫func2 六次。它每次返回不同的值吗?如果没有,这可行:

    (define (func1 input)
      (make-list 6 (func2 input)))
    

    【讨论】:

      【解决方案3】:

      这个问题有点令人困惑,您应该提供给定输入的预期输出样本。为什么在您的代码中对空字符串的处理方式不同?显然,递归应该在x 的值上前进,而不是func2 返回的字符串的值。另外,为什么要复制字符串?似乎没有必要。

      假设命名 let 仅用于跟踪迭代次数,此解决方案似乎符合您的意图,因为这将返回由 func2 返回的所有字符串的 6 元素列表

      (define (func1 input)
        (let kloop ((x 6))
          (if (zero? x)
              '()
              (cons (func2 input)
                    (kloop (- x 1))))))
      

      但我们可以更聪明一点,使用命名为let 来给出tail-recursive 的解决方案,这样效率更高:

      (define (func1 input)
        (let kloop ((x 6)
                    (acc '()))
          (if (zero? x)
              acc
              (kloop (- x 1)
                     (cons (func2 input)
                           acc)))))
      

      【讨论】:

      • 希望在尾递归版本中返回 (reverse acc)(与您的非尾递归解决方案保持一致)。
      • @GoZoner 是和否 :P 这取决于您的问题的答案:如果 func2 总是返回相同的值,那么最后不需要反转。如果它确实返回不同的值,我同意你的看法,reverse 必须在过程的尾递归版本结束时执行
      猜你喜欢
      • 2012-03-20
      • 1970-01-01
      • 2023-04-07
      • 2012-05-15
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多