1

我在方案中的功能看起来像这样

(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 中的字符串。现在我必须创建此函数返回的所有字符串的列表。在上面,我只是显示这些字符串。我尝试了不同的方法,但没有任何效果。我尝试使用附加和缺点。

请建议。

4

3 回答 3

1

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

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

(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")
于 2013-04-26T09:35:52.493 回答
0

你打func2input六次电话。它每次返回不同的值吗?如果没有,这有效:

(define (func1 input)
  (make-list 6 (func2 input)))
于 2013-04-26T14:19:28.033 回答
0

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

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

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

但是我们可以更聪明一点,使用 namedlet来给出一个尾递归的解决方案,这样效率更高:

(define (func1 input)
  (let kloop ((x 6)
              (acc '()))
    (if (zero? x)
        acc
        (kloop (- x 1)
               (cons (func2 input)
                     acc)))))
于 2013-04-26T14:34:31.757 回答