新手在这里。甚至更新的递归。我正在为我的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。
任何帮助都表示赞赏。提前谢谢!
答案 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] == true
和relations[j][i] == true
,您的代码仍将处于无限循环中。你必须找到一种方法来消除潜在的回溯。一种方法是创建另一个数组来存储您已经检查过的路径,这样就不会无限循环。
可在此处找到更多信息:Depth First Search