从方案中的深度递归循环中获取变量

时间:2011-03-30 22:02:08

标签: scheme

我有一个深度递归过程,当它找到问题的解决方案时输出一个列表,但是这个列表是递归创建的。这是代码:

(define (dfs start target)
  (define (dfs-helper start target path new-links final-path)
    (display final-path) (newline)
    (if (null? final-path)
       (if (or (null? new-links) (member start path)) '()
               (first-not-null (lambda (x)
                                 (if (= start target) (dfs-helper x target path '() (append path (list start))) (dfs-helper x target (append path (list start)) (get-neighbors x) final-path)))
                           (get-neighbors start))

       )
       final-path 
    )
 )
 (dfs-helper start target '() (get-neighbors start) '())
)

(我为奇怪的格式化道歉)

无论如何,这会输出以下内容:

...
()
()
(1 7 20 15 22 23 39 40 49 41 31 25 17 18 9 19 26 36 27 12 11 10 3 13 14 21 28 37 43 53 44 52 51 42 50 54 57 58 61 62 60 63)
7

这是我需要的最后一行的第二个。正如你所看到的,当我显示'final-path'时,我得到我想要的东西,但出于某种原因(我认为因为所有的递归调用),最后的实际变量只是7,而不是所有数字的列表我想要。如何让我的代码从最后一行输出第二行,这样我就可以操作它返回的列表了?

2 个答案:

答案 0 :(得分:3)

Oog ...这段代码可以简单一些。我来提一些建议。

首先,在父函数内部定义帮助器对你没有帮助;它使得无法独立测试;把它移到外面。

接下来,我不清楚为什么你有两个论点,“路径”和“最终路径”;一行目的陈述在这里真的有用。部分原因是决定你的功能在失败时应该返回什么。

最后,你真的需要一些测试用例来展示这些东西应该为简单输入产生什么。

我意识到你完全有可能在寻找“快速解决方案”;我应该告诉你,一个解决方案在其他东西之上抛出一个可变变量肯定不会在我班上取得好成绩......

为我的高调语气提前道歉:)。

答案 1 :(得分:0)

而不是使用换行符显示final-path作为打印输出而无法访问它,而是创建一个列表作为dfs对象的成员。然后追加到该列表成员,并在dfs返回时处理该列表。例如:

(define (dfs start target)
  (define return-list '()) ;;add a return list here that you will process later
  (define (dfs-helper start target path new-links final-path)
    ;;(display final-path) (newline)
    (set! return-list (cons final-path return-list)) ;;so you are now "building up" the return list
    (if (null? final-path)
       (if (or (null? new-links) (member start path)) '()
               (first-not-null (lambda (x)
                                 (if (= start target) (dfs-helper x target path '() (append path (list start))) (dfs-helper x target (append path (list start)) (get-neighbors x) final-path)))
                           (get-neighbors start))

       )
       final-path 
    )
 )
 (dfs-helper start target '() (get-neighbors start) '())

 ;;process the return-list value to get the values you're wanting from it ...
 ;;I'm guessing there is something specific you're looking for, i.e., you can
 ;;filter out all the empty-list elements, single-value elements, etc.
)