String 方案字符串列表

String 方案字符串列表,string,list,scheme,String,List,Scheme,我在scheme中的函数如下所示 (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中的字符串。现在我必须创建一个由这个函数返回的所有字符串的列表。在

我在scheme中的函数如下所示

(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


请建议。

如果缺少else,您的最后一个
,这是函数返回值的期望值

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

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

如果
缺少else,则最后一个
,这是函数返回值的期望值

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

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

您在
input
上调用
func2
六次。它是否每次都返回不同的值?如果没有,这是可行的:

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

您在
input
上调用
func2
六次。它是否每次都返回不同的值?如果没有,这是可行的:

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

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

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

(define (func1 input)
  (let kloop ((x 6))
    (if (zero? x)
        '()
        (cons (func2 input)
              (kloop (- x 1))))))
但是,我们可以更聪明地使用名为
let
的方法来提供更有效的解决方案:

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

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

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

(define (func1 input)
  (let kloop ((x 6))
    (if (zero? x)
        '()
        (cons (func2 input)
              (kloop (- x 1))))))
但是,我们可以更聪明地使用名为
let
的方法来提供更有效的解决方案:

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

什么是
输入2
?为什么
string copy
(某些内容正在破坏性地修改
func2
的结果)?当然,显示某些内容与返回某些内容并不相同。显示生成对象的打印表示;返回返回对象。什么是
input2
?为什么
string copy
(某些内容正在破坏性地修改
func2
的结果)?当然,显示某些内容与返回某些内容并不相同。显示生成对象的打印表示;返回返回对象。希望尾部递归版本中的返回为
(反向acc)
(与非尾部递归解决方案一致)。@GoZoner是和否:P这取决于您问题的答案:如果
func2
始终返回相同的值,则无需在结尾处反转。如果它确实返回不同的值,我同意您的意见,必须在程序的尾部递归版本末尾执行
反向
。请参考尾部递归版本中的返回,使其成为
(反向acc)
(与非尾部递归解决方案一致)@GoZoner yes and no:P这取决于您问题的答案:如果
func2
始终返回相同的值,则无需在末尾反转。如果它确实返回不同的值,我同意您的意见,则必须在程序的尾部递归版本结束时执行
反向操作