我无法在java中修改我的静态变量

时间:2017-01-11 07:01:49

标签: java recursion

你给了一个网格(这里是4x4)。你需要找出从(0,0)到(4,4)的唯一路径的总数。 main()为此调用函数pathify。它找到可能的“后续步骤”并再次调用它。当达到(4,4)noOfPaths ++;应该执行。这不会发生,我找不到问题。

 MultipleFileUpload upload = tm.uploadFileList(
            "backetname", s3_path, myDir_temp, collection_file, metadataProvider);

1 个答案:

答案 0 :(得分:1)

错误在于您处理alreadyVisited的方式。第一次调用pathify时,此列表将仅包含初始方块(0,0),这很好。这是代码的重要部分:

            for (int t=0,temp; t<callAgain.size(); t++) {
                temp=(int) callAgain.get(t);
                pathify(temp/10, temp%10, alreadyVisited);
            }

您已找到初始单元格的邻居。你的代码会选择第一个邻居;然后它会找到以该邻居开头的路径,并且对pathify的递归调用会将单元格添加到alreadyVisited

现在,在所有递归调用返回后,您已准备好找到以初始单元格的 second 邻居开头的单元格。但是你有一个问题: alreadyVisited仍然拥有它从第二个邻居开始找到的路径中收集的所有单元格。所以你不会找到所有可能的从第二个邻居开始的路径;您在以前找到的任何路径中找不到包含任何单元格的路径。这不是您想要的,因为您只想避免访问每个路径中的同一个单元格 - 您不希望避免访问以前所有路径中的同一个单元格。 (我简化了一点。实际上,问题将在递归堆栈的深处开始,你甚至找不到从第一个邻居开始的所有路径。)

在实现递归算法时,我发现保持由这些调用将修改的递归调用共享的中间数据结构通常是个坏主意。在这种情况下,该列表是alreadyVisited。问题是,当深层向下的调用修改结构时,这会进一步影响调用,因为它们会在更深层次的调用返回后看到修改,这基本上是他们需要在其下面进行更改的数据。 (我不是在谈论用于保存结果列表的集合,如果列表基本上是只写的。)这里避免它的方法是,而不是添加到alreadyVisited,你可以创建此列表的 clone ,然后添加到该列表中。这样,更深入的调用可以确保它不会通过更改其数据来影响较浅的调用。也就是说,而不是

alreadyVisited.add(x*10+y);

alreadyVisited = [make a copy of alreadyVisited];
alreadyVisited.add(x*10+y);

add将修改新列表,而不是其他调用正在使用的列表。 (就个人而言,我要声明一个新的变量,例如newAlreadyVisited,因为我不太喜欢修改参数,这是出于可读性的原因。)

这似乎效率低下。它肯定会使用更多内存(尽管内存应该很快就可以收集垃圾)。但是,尝试在递归调用之间共享数据结构非常非常难以正确执行。如果您非常小心地清理更改并将结构恢复到方法开始时的状态,则可以执行此操作。如果结构类似于大树,那么这可能是必要的,这使得复制每次调用都不可行。但是要让事情发挥作用需要很多技巧。

编辑:我测试过它似乎有效:如果xRows = yColumns = 2则为12,如果两者都为4则为8512(这是正确的吗?)。另一种方法:我试过

而不是复制列表
alreadyVisited.remove((Object)(x*10+y));

在方法的最后((Object)是必需的,以便Java不会认为你在索引中删除)并且这给了我相同的结果。如果您这样做,那么当alreadyVisited返回时,pathify与启动时相同,请确保<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" xmlns:sec="http://www.springframework.org/schema/security" xmlns:mail="http://www.springframework.org/schema/integration/mail" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/integration/mail http://www.springframework.org/schema/integration/mail/spring-integration-mail-1.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"> <!-- Configures the @Controller programming model --> <mvc:annotation-driven /> <!-- Scans the classpath of this application for @Components to deploy as beans --> <context:component-scan base-package="fi.vietjob" /> <!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> <!-- Forwards requests to the "/" resource to the "welcome" view --> <mvc:view-controller path="/" view-name="index" /> <!-- location of static content (images, js and css files) --> <mvc:resources mapping="/resources/**" location="/resources/" /> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basename" value="classpath:lang" /> <property name="defaultEncoding" value="UTF-8" /> </bean> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> <property name="defaultLocale" value="vn" /> </bean> <mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> <property name="paramName" value="lang" /> </bean> </mvc:interceptors> <!--config for upload image --> <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver" /> </beans> 相同。但我想强调一点,我不推荐这个&#34;清理&#34;除非你真的知道你在做什么,否则接近。