首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代算法到递归算法

迭代算法到递归算法
EN

Stack Overflow用户
提问于 2022-01-20 14:38:14
回答 2查看 91关注 0票数 0

我需要一些帮助将迭代算法转换为递归算法。

我需要生成所有的4个数字,之和为11,其中第一个数字总是1,而其他3个数字至少是2。

代码语言:javascript
复制
  for(int i = 1 ; i < 7; i ++ ){
        for(int j = 2; j < 7; j ++ ){
            for(int k = 2; k < 7; k ++ ){
                for(int p = 2; p < 7; p ++ ){
                    if(i + j + k + p == 11 &&  i == 1){
                        printf(" %d %d %d %d \n", i, k, j, p);
                    }
                }
            }
        }
    }

一些输出示例:

代码语言:javascript
复制
 1 2 2 6
 1 3 2 5
 1 4 2 4
 1 5 2 3

这是可行的,但它的设计非常糟糕,我需要用递归来完成。

EN

回答 2

Stack Overflow用户

发布于 2022-01-20 17:43:16

首先,这里有一点数学:假设有4个数字,num1,num2,num3和num4,它们需要加到11,所以,

代码语言:javascript
复制
num1+num2+num3+num4=11
num1=1 and num2>=2, num3>=2, num4>=2
num2+num3+num4=11-num1=10
(num2-2)+(num3-2)+(num4-2)=10-(2+2+2)=4
var2+var3+var4=4, where var2, var3 and var4>=0

它归结为找到3个非负数,使它们以递归的方式相加为4。下面是一个通用的解决方案,然后可以进行相应的修改:下面的代码可以这样做,在C++中:

代码语言:javascript
复制
#include <iostream>
#include <vector>

void get_target_sum(std::vector<std::vector<int>>& total_ans, std::vector<int>& curr_ans, int num_remaining, int targetnum){
// total_ans denotes all the tuples, curr_ans denotes the current 
// computation, num_remaining denotes the numbers remaining which 
// should sum up to targetnum.
// each time we find a valid number which can be a part of our answer, we 
// add it to curr_ans, decrement num_remaining since the numbers remaining 
// has decreased by 1, and decrease the target number to be found by the 
// value of the number
    if(num_remaining<1){return;}
    if(num_remaining==1){
        curr_ans.push_back(targetnum);
        total_ans.push_back(curr_ans);
        curr_ans.pop_back();
    }
    for(int curr_num=0;curr_num<targetnum;curr_num++){
        curr_ans.push_back(curr_num);
        get_target_sum(total_ans,curr_ans,num_remaining-1,targetnum-curr_num);
        curr_ans.pop_back();
    }

}
int main()
{
    std::vector<std::vector<int>>final_ans;
    std::vector<int> curr_ans;
    get_target_sum(final_ans,curr_ans,3,4);
    for(int i=0;i<final_ans.size();i++){
        std::cout<<1<<" ";
        // The first variable
        for(auto num:final_ans[i]){
            std::cout<<num+2<<" ";
            // the other 3 variables, incremented by 2.
        }
        std::cout<<"\n";
    }
    return 0;
}

输出:https://onlinegdb.com/gdQdLgni8

票数 1
EN

Stack Overflow用户

发布于 2022-01-20 16:19:16

第一个数字总是1,不需要循环。对于其余部分,您可以创建一个函数,将所有的可能性加到一个特定的数字上。下面是一个Java语法的程序,但不使用类,因此很容易被C语言所翻译:

代码语言:javascript
复制
public void printPossibilities(int rest, int[] buffer, int len, int total) {
    if (len + 1 == total) {
        buffer[len] = rest;
        System.out.println(Arrays.toString(buffer));
    } else {
        // check if it is possible that the rest of the numbers are >= 2
        for (int i = 2; rest >= i + (total - len - 1) * 2; i++) {
            buffer[len] = i;
            printPossibilities(rest - i, buffer, len + 1, total);
        }
    }
}

// call with
int[] buffer = new int[4];
buffer[0] = 1;
printPossibilities(10, buffer, 1, 4);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70788113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档