提前道歉,我對c和編程很陌生。
我目前正在研究遞回函式是如何作業的并且有一個主要的心理障礙。
我得到了一個遞回函式的例子,它用哈希符號創建了一個“金字塔”(見下文)。我不明白為什么輸出沒有水平翻轉,頂部有 n 個哈希,底部有 1 個哈希。
為了理解它,我創建了一個表,其中包含回圈數、n 值、n - 1 值以及我認為應該如何列印的 man hashes。

在回圈 1 上,n 從 4 開始,“for 回圈”應該運行 4 次,因為“i”在 0、1、2 和 3 期間經過。
換
行在
回圈 2 上,n 現在是 3,“for 回圈” " 應該運行 3 次,因為 "i" 在 0、1 和 2 期間經過。
依此類推……
我創建了嵌套的 for 回圈,我認為它會提供相同的結果:n(高度)最初是 4 并且作業到 0,我從 0 列印哈希向上作業,但結果完全相反。
#include <cs50.h>
#include <stdio.h>
void draw(int n);
int main(void)
{
// prompt user for height of pyramid
int height = get_int("Height ");
// call recursive 'draw' function
draw(height);
printf("\n");
// my nested loop function I made that I can't tell how is different from the recursive function
for (int n = height; n >= 0; n--)
{
for (int i = 0; i < n; i )
{
printf("#");
}
printf("\n");
}
}
// recursive function example I was given that I cannot make sense of
void draw(int n)
{
if (n <= 0)
{
return;
}
draw(n - 1);
for (int i = 0; i < n; i )
{
printf("#");
}
printf("\n");
}
結果如下。他們的結果在上面。我在它下面。

如果有人可以幫助澄清我所缺少的,我將不勝感激。
uj5u.com熱心網友回復:
看看這個遞回何時會發出它的第一個輸出
void draw(int n)
{
if (n <= 0)
{
return;
}
draw(n - 1);
for (int i = 0; i < n; i )
{
printf("#");
}
printf("\n");
}
看到它在 之前一直呼叫自己,它printf只是停止做一個 n 達到 0,然后它開始回傳并呼叫列印,但是以 n 的相反順序。
即它去
draw(4)->draw(3)->draw(2)->draw(1)->draw(0)
printf loop *1
printf loop * 2
printf loop * 3
printf loop * 4
uj5u.com熱心網友回復:
draw(n-1);您已經在 for 回圈之前呼叫了。因此,函式像這樣遞回呼叫。
Draw(4);從主函式呼叫第一個函式。然后呼叫Draw(4-1); -> Draw(3); Then 再次Draw(3-1); -> Draw(2);它不會轉到具有 for 回圈的行,直到基本條件。因此, next 再次呼叫Draw(2-1); -> Draw(1);
After ,Draw(1-1); -> Draw(0);因為 n=0 函式將回傳。
接下來現在倒退。因為你還沒有完成 Draw(n) 函式。你只是遞回地呼叫它自己。完成后,你有列印部分。由于您現在在Draw(1),您從 1 開始列印。您Draw(1)來自Draw(4)。所以現在你必須再次回到Draw(4)from Draw(1)。這就是我們倒退的原因。
路徑說明:
現在你在 Draw(1); 所以它列印#。然后完成 Draw(1); 接下來Draw(2);列印##。接下來Draw(3);列印###。接下來Draw(4);列印####。
這就是遞回函式的作業原理。因此輸出是,
#
##
###
####
在您的嵌套回圈中,它從 4 開始。因為您使用了n=height. 所以你的代碼應該從 n=1 開始,如下面的代碼。
for (int n = 1; n <= height ; n )
{
for (int i = 0; i < n; i )
{
printf("#");
}
printf("\n");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/448223.html
標籤:C
