简单的递归函数,用于确定两个元素是否可传递为真

时间:2015-10-05 05:15:00

标签: c++ arrays recursion adjacency-matrix

新手在这里。甚至更新的递归。我正在为我的C ++程序编写一个函数,而且正如你能说的那样,在递归算法方面,我有点无能为力。如果有人可以修复我的功能,我会非常感激,所以我可以让它工作,或许可以更好地了解如何处理递归。

我的函数采用二维方形布尔数组,整数i和整数array_size作为参数。该函数返回一个布尔值。

数组是一个邻接矩阵,用于表示一组条件。例如,如果[0] [3]处的值为真,则0 - > 3(如果为0,则为3)。如果[3] [7]为真,那么3 - > 7(如果是3,那么7)。通过传递性质,0 - > 7(如果为0,则为7)。

整数i是条件集中的特定元素。如果此元素可传递地连接到数组中的最后一个元素,则该函数将返回true。数组中的最后一个元素是整数(array_size - 1),

整数array_size是方阵的每个维度的大小。如果array_size为20,则数组为20x20。

这个功能的想法是确定是否有任何逻辑"路径"传递属性从第一个整数元素到最后一个整数元素。当路径存在时,函数返回true,否则返回false。递归调用应该允许它遍历所有可能的路径,一旦它最终到达最后一个元素就返回true,如果所有路径都失败则返回false。

例如,如果i = 0且array_size = 10,则函数将返回0 - >根据矩阵和传递性质提供的条件,9是有效的。

到目前为止,这是我的代码:

bool checkTransitivity(bool **relations, int i, int array_size){
bool isTransitive = false;

if (i == array_size - 1)
{
    isTransitive = true;
}
else
{
    for (int j = i; j < array_size; j++){
        if (relations[i][j])
        {
            isTransitive = checkTransitivity(relations, j, array_size);
        }
    }
}

return isTransitive;

目前,该函数对所有输入都返回true。

任何帮助都表示赞赏。提前谢谢!

2 个答案:

答案 0 :(得分:0)

认为您需要的是@Configuration @EnableWebMvc @ComponentScan(basePackageClasses = Application.class) public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } @Bean public InternalResourceViewResolver jspViewResolver() { InternalResourceViewResolver bean = new InternalResourceViewResolver(); bean.setPrefix("/WEB-INF/views/"); bean.setSuffix(".jsp"); return bean; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("/WEB-INF/static/"); }} 条件,以便在遇到非传递项时停止继续循环。见下文(尚未测试)

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!--H2-->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!--couchbase-->
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-couchbase</artifactId>
        <version>1.4.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.couchbase.client</groupId>
        <artifactId>couchbase-client</artifactId>
        <version>1.4.9</version>
    </dependency>
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>3.0</version>
    </dependency>

    <!--JSON-->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

</dependencies>

答案 1 :(得分:0)

编辑:由于你的if-else语句,第一部分是不必要的。继续编辑结束。

让我们从递归函数的基本情况开始:

if (i == array_size - 1)
{
    isTransitive = true;
} 

嗯,你确实有一个基本案例,但没有任何东西被退回。您只是将标志设置为true。你想要做的是:

if (i == array_size - 1) {
    return true;
}

现在该函数将在递归堆栈中向上运行以返回true。编辑结束。

但我们仍然需要修复递归案例:

else {
    for (int j = i; j < array_size; j++) {
        if (relations[i][j]) {
            isTransitive = isTransitive || checkTransitivity(relations, j, array_size);
        }
    }
}

return isTransitive;

||表示二进制OR。所以你有正确的逻辑。您想检查每个可能的路径以查看它是否可以到达那里,但是通过将isTransitive设置为每次检查的结果,isTransitive将仅设置为最后一次调用。通过执行isTransitive = isTransitive || recursive call,只要其中一个调用产生真值,isTransitive就会为真。

我想说的最后一件事是谨慎:如果relations[i][j] == truerelations[j][i] == true,您的代码仍将处于无限循环中。你必须找到一种方法来消除潜在的回溯。一种方法是创建另一个数组来存储您已经检查过的路径,这样就不会无限循环。

可在此处找到更多信息:Depth First Search

相关问题