我们在作业中收到了一个问题。我在解释它时遇到了麻烦,所以我用相同的条件用 C++ 重写了它。但是,我似乎无法获得问题中列出的正确输出。有人可以建议我如何进行吗?
这是问题的片段。
这是我的代码:
#include <iostream>
#include <string>
using namespace std;
int main(){
int n; //AreWeThereYet
string a;
a="Yes we have arrived";
string b;
b="We just left";
string c;
c="That was annoying";
string d;
d="Almost";
int i;
cout << "enter n" << endl;
cin >> n;
for(int i=0;i<=n;i++){
//here starts the calc
if(n==0){
cout << a << endl;
return 0;
}
if(n>5){
cout << b << endl;
n=(n-1);
}else if(n>1){
n=(n-2);
cout << c << endl;
}else{
cout << d << endl;
n=(n-1);
}
}
}
循环似乎无法输出第一个问题和最后一个问题。
我想如果我重复这个问题,我可以通过反复试验来获得我需要的答案。下面我附上了我的输出图像。我希望输入“1”输出“几乎”,然后是“是的,我们已经到达”。
我们可以考察和讨论第一种情况。
输出应该是:
Almost
Yes we have arrived
That was annoying
That was annoying
如果你画一条数轴:
<- <0 - 0 - 1 - 2-3-4-5 - 6+ ----->
Almost|Yes we have arrived|Almost|That was annoying|We just left|
然后,我们只需查看输出并开始对其进行推理。
几乎发生在负数和 1 上。我们可以排除负数,因为没有办法从负数跳到正数,因为每种情况都会做减法。所以,第一个“几乎”意味着 n 是 1。这就解释了前两行,而不是后两行。那么,我们如何得到“那很烦人”呢?
它需要 [2, 5] 范围内的 n。并注意的情况下,它使一个递归调用第一,然后打印,“这是讨厌”。那么,什么起始值n
可以落在“这很烦人”块中并称为“几乎”块?
答案是 3。所以现在我们将手动遍历算法,假设 n = 3。
当 n == 3 时,它落入条件 n > 1。它做的第一件事是用值 n - 2 = 1调用自己。这将打印 'Almost',然后打印 'Yes we have到达',因为带有 'Almost' 的块用 n - 1 = 0调用自己。现在所有的嵌套调用都处理完毕,当 n== 3 时我们返回到初始块,并打印“这很烦人”,但我们只打印一次。所以,3不对。
如果我想再次打印“那很烦人”,那么我只需要将 n 增加到 4。
我们可以对 n = 4 进行快速检查。我将进入“烦人”块,使用 n - 2 = 2拨打电话,然后再次进入“烦人”块(我们需要打印 ' 这很烦人两次) ,并使用 n-2 = 0再次调用。我们跳过了“几乎”,所以 4 是不正确的。
所以我们看 5. 5 - 2 = 3, 3 - 2 = 1。一路追踪,应该产生相同的输出。
没有代码,只有一个号码线和跟踪电话。这可以通过物理笔记卡或绘制递归堆栈来完成。
如果您仔细查看第三个输出,您应该注意到它大部分已经解决了,因为最后四行与我们刚刚解决的块相同。
这是一个很好的解决问题的技巧;使用以前解决的问题来分解和解决更大的问题。这就是为什么这项任务最好在没有代码的情况下完成,并且由您提出解决方案。其他人的解决方案最终成为您自己的解决方案中唯一的解决方案,您将更加挣扎。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句