void funct(int n)
{
int steps = 0;
if(n != 1){
steps ;
if((n % 2) == 0){
funct(n/2);
}
else if((n % 2) != 0){
funct((3*n 1));
}
cout << steps << " ";
}
}
我試過這段代碼,但每次都列印 1;我希望我的代碼列印它被呼叫的次數。
uj5u.com熱心網友回復:
steps是一個區域變數,在funct每次呼叫中funct都有自己的副本。您需要通過所有呼叫傳遞單個變數funct才能正確計數。
void funct(int n, int& steps)
{
if(n != 1){
steps ;
if((n % 2) == 0){
funct(n/2, steps);
}
else if((n % 2) != 0){
funct((3*n 1), steps);
}
}
}
int main()
{
int steps = 0;
funct(5, steps);
cout << steps << "\n";
}
uj5u.com熱心網友回復:
就目前而言,steps函式中的變數是自動存盤持續時間的區域變數。后者意味著它將在每次呼叫函式時重新初始化為零。
您可以將static關鍵字添加到宣告中以使其初始化(為零)僅在第一次呼叫函式時發生(cppreference),從那時起,修改后的值將在函式的后續呼叫中保持(直到或除非它被明確重置1)。
但是,即使這樣,如果您想查看“滾動”計數,則需要在進行任一遞回呼叫之前cout放置該行(報告值的位置) 。
這是一種可能性(我還將您的測驗條件從 更改n != 1為n > 1,以防止您的問題的評論中提到的潛在無限遞回):
void funct(int n)
{
static int steps = 0; // Initialized only the first time this line is reached
if (n > 1) {
steps ;
std::cout << steps << " ";
if ((n % 2) == 0) {
funct(n / 2);
}
else if ((n % 2) != 0) {
funct((3 * n 1));
}
}
}
1實作這種“顯式”重置的一種方法是else在遞回鏈完成時在一個塊中執行此操作。以下代碼顯示了如何執行此操作,以及main顯示行為如何在多個連續的“頂級”呼叫中起作用的短片funct:
#include <iostream>
void funct(int n)
{
static int steps = 0;
if (steps == 0) {
std::cout << "Top-level call with " << n << "... ";
}
if (n > 1) {
steps ;
std::cout << steps << " ";
if ((n % 2) == 0) {
funct(n / 2);
}
else if ((n % 2) != 0) {
funct((3 * n 1));
}
}
else {
std::cout << std::endl;
steps = 0;
}
}
int main()
{
funct(5);
funct(9);
funct(8);
return 0;
}
輸出:
Top-level call with 5... 1 2 3 4 5
Top-level call with 9... 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Top-level call with 8... 1 2 3
另一種方法是使用“特殊”值(例如,負數)來更改函式的行為,這樣,如果傳遞了這樣的值,函式將重置steps為零,然后立即回傳。
uj5u.com熱心網友回復:
讓函式回傳它被呼叫的次數。這總是比遞回呼叫報告的呼叫次數多一:
int funct(int n)
{
int steps = 0;
if(n != 1){
if((n % 2) == 0){
steps = funct(n/2);
}
else {
steps = funct((3*n 1));
}
}
return steps 1;
}
int main()
{
int steps = funct(5);
cout << steps << "\n";
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/435291.html
上一篇:通過指標呼叫成員函式
下一篇:如何使用嵌套命名空間來避免歧義?
