String 方案字符串列表
我在scheme中的函数如下所示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中的字符串。现在我必须创建一个由这个函数返回的所有字符串的列表。在
(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
始终返回相同的值,则无需在末尾反转。如果它确实返回不同的值,我同意您的意见,则必须在程序的尾部递归版本结束时执行反向操作