完全披露:这是一个小问题,我更喜欢你提供最少量的代码来解释这个问题,我很感激我得到的任何帮助。
基本上我必须编写一个函数,以下列方式递归打印出2 ^ n-1项:
The output if n=1 is: 1
The output if n=2 is: 1 2 1
The output if n=3 is: 1 2 1 3 1 2 1
The output if n=4 is: 1 2 1 3 1 2 1 4 1 2 1 3 1 2 1
我不知道如何才能做到这一点。我正在玩斐波纳契系列,但这看起来像死路一条。谢谢!
答案 0 :(得分:4)
第1步:
首先分析问题。你发现它需要递归。
第2步:
找出递归方案并建立一个假设:
对于n==2
,您的答案为1 2 1
,n==3
ans为1 2 1 3 1 2 1
,然后您突然注意到n==3
您正在为n==2
撰写第一个答案然后3
并再次回答n==2
所以现在你的假设将是n-1然后n和n再次回答n-1
第3步:
验证假设:
现在你应该验证你是否正确。你检查了n = 2和n = 4哇!你找到了预期的答案。现在你有一个经过验证的递归假设。来吧,写一个代码。
第4步:
写下代码:
首先找出基本情况:这里是n = 1因为你不能更深入。
所以我们的功能开始如下:
void foo(int n){
if(n==1){
cout<<1;
return ;
}
}
现在使用我们的假设,写下剩余的代码。
void foo(int n){
if(n==1){
cout<<1;
return ;
}
foo(n-1); //our hypothesis say first we need to write the answer for n-1
cout<<" "<<n<<" "; //then writing n itself
foo(n-1); //again writing answer for n-1
}
答案 1 :(得分:1)
此函数应作为完整二叉树上的就地遍历工作。就像你有以下树:
3
2 2
1 1 1 1
反映的树在每个级别中具有相同的值。 所以你的功能应该是:
void func(int n) {
if (n == 1) {
cout << "1 ";
return;
}
func(n - 1);
cout << n << ' ';
func(n - 1);
}
答案 2 :(得分:1)
鉴于已经给出了答案,这里有一个简短的版本:
bool f(int i)
{
return i && (f(i-1), std::cout << i << ' ', f(i-1));
}
答案 3 :(得分:1)
很简单,你试图用较少的数字覆盖每个数字(并且该数字将通过递归自身重复相同的过程),直到参数(n)达到0.在这种情况下,它将返回而不做任何事情。
代码如下所示:
void sequence(int n) {
if (n == 0)
return;
sequence(n-1);
cout << n << ' ';
sequence(n-1);
}