2013-04-26 64 views
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返回存储在行为一些字符串。现在我必须创建这个函数返回的所有字符串的列表。在上面,我只是显示这些字符串。我尝试了不同的方法,但没有任何解决方法。我试着使用append和cons。

请建议。

+0

什么是'input2'?为什么'string-copy'(某些东西破坏性地修改'func2'的结果)? – GoZoner 2013-04-26 14:18:54

+0

而且,当然,显示内容与返回内容不一样。显示产生对象的打印表示;返回返回对象。 – GoZoner 2013-04-26 16:50:02

回答

1

你最后if缺少其他情况下,这也正是人们所期望的函数的返回值是。

你不提你是如何试图用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") 
0

要调用func2input六倍。它每次都会返回一个不同的值吗?如果没有,这个工作:

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

这个问题有点混乱,你应该提供一个给定输入的预期输出的样本。为什么空字符串在代码中的处理方式不同?显然递归值应该是x的值,而不是由func2返回的字符串的值。另外,你为什么复制字符串?似乎不必要。

假设名为let只是用于保持迭代次数的轨道,这种解决方案似乎与你的意图一致,因为这将返回func2

(define (func1 input) 
    (let kloop ((x 6)) 
    (if (zero? x) 
     '() 
     (cons (func2 input) 
       (kloop (- x 1)))))) 
返回的所有字符串的6元素列表

但我们可以更聪明,并使用指定的let给予tail-recursive解决方案,这是更有效的:

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

希望你的尾递归版本的返回是'(反向acc)'(与你的非尾递归解决方案一致)。 – GoZoner 2013-04-26 16:47:30

+0

@GoZoner yes和no:P这取决于回答你的问题:如果'func2'总是返回相同的值,那么就没有必要在年底扭转。如果_does_返回不同的值,我同意你,在程序的尾递归版本末尾必须执行“反向”操作 – 2013-04-26 16:52:28