我不理解这段代码中的递归。这是 CS50 pset3 中 atoi 练习问题的答案。

huangapple go评论59阅读模式
英文:

I don't understand the recursion in this code. It's the answer to the CS50 pset3 atoi practice problem

问题


    #包括 <cs50.h>
    #包括 <ctype.h>
    #包括 <math.h>
    #包括 <stdio.h>
    #包括 <string.h>

    int 转换(string 输入);
    int 数字 = 0;
    int 主(void)
    {
        string 输入 = 获取字符串("输入一个正整数:");

        对于 (int i = 0,n = 字符串长度(输入); i < n; i++)
        {
            如果 (!isdigit(输入[i]))
            {
                printf("无效输入!\n");
                返回 1;
            }
        }

        // 将字符串转换为整数
        printf("%i\n", 转换(输入));
    }

    int 转换(string 输入)
    {
        // 待办事项
        int n = 字符串长度(输入);

        如果 (n == 0)
        {
            返回 数字;
        }
        字符 最后一位数字 = 输入[n - 1];
        int 转换后的最后一位数字 = 最后一位数字 - '0';
        输入[n-1] = '

    #包括 <cs50.h>
    #包括 <ctype.h>
    #包括 <math.h>
    #包括 <stdio.h>
    #包括 <string.h>

    int 转换(string 输入);
    int 数字 = 0;
    int 主(void)
    {
        string 输入 = 获取字符串("输入一个正整数:");

        对于 (int i = 0,n = 字符串长度(输入); i < n; i++)
        {
            如果 (!isdigit(输入[i]))
            {
                printf("无效输入!\n");
                返回 1;
            }
        }

        // 将字符串转换为整数
        printf("%i\n", 转换(输入));
    }

    int 转换(string 输入)
    {
        // 待办事项
        int n = 字符串长度(输入);

        如果 (n == 0)
        {
            返回 数字;
        }
        字符 最后一位数字 = 输入[n - 1];
        int 转换后的最后一位数字 = 最后一位数字 - '0';
        输入[n-1] = '\0';

        返回 转换后的最后一位数字 + 10 * 转换(输入);
    }
这是 pset 3 练习问题 atoi 的解决方案,老实说,它给我留下了更多的疑问而不是答案。首先,我完全不知道变量 "数字" 如何变成数字。它在顶部初始化为0,但在这一切之后它以某种方式变成你最后输入的数字?接下来,我不知道在代码的最后一行添加10会做什么。为什么是10?当你在最后做 convert(input) 时,你怎么最终得到你输入的数字呢?假设我输入123。它从最后一个数字(3)开始,然后是倒数第二个数字(2),然后是第一个数字(1)。那么为什么它不返回321?实际上,我甚至惊讶它居然返回一个三位数。当 converted_last_digit 变量等于3时,它再次循环以获取2,然后是1。但是那些数字存储在哪里?当再次循环时,2 现在等于 converted_last_digit。然后 1 等于 converted_last_digit。应该就是这样了,对吧?那些数字是怎么回来的?为什么它不返回1?那些数字是如何保存的?

';
返回 转换后的最后一位数字 + 10 * 转换(输入); } 这是 pset 3 练习问题 atoi 的解决方案,老实说,它给我留下了更多的疑问而不是答案。首先,我完全不知道变量 "数字" 如何变成数字。它在顶部初始化为0,但在这一切之后它以某种方式变成你最后输入的数字?接下来,我不知道在代码的最后一行添加10会做什么。为什么是10?当你在最后做 convert(input) 时,你怎么最终得到你输入的数字呢?假设我输入123。它从最后一个数字(3)开始,然后是倒数第二个数字(2),然后是第一个数字(1)。那么为什么它不返回321?实际上,我甚至惊讶它居然返回一个三位数。当 converted_last_digit 变量等于3时,它再次循环以获取2,然后是1。但是那些数字存储在哪里?当再次循环时,2 现在等于 converted_last_digit。然后 1 等于 converted_last_digit。应该就是这样了,对吧?那些数字是怎么回来的?为什么它不返回1?那些数字是如何保存的?
英文:
#include <cs50.h>
#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <string.h>

int convert(string input);
int number = 0;
int main(void)
{
    string input = get_string("Enter a positive integer: ");

    for (int i = 0, n = strlen(input); i < n; i++)
    {
        if (!isdigit(input[i]))
        {
            printf("Invalid Input!\n");
            return 1;
        }
    }

    // Convert string to int
    printf("%i\n", convert(input));
}

int convert(string input)
{
    // TODO
    int n = strlen(input);

    if (n == 0)
    {
        return number;
    }
    char last_digit = input[n - 1];
    int converted_last_digit = last_digit - '0';
    input[n-1] = '
#include <cs50.h>
#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
int convert(string input);
int number = 0;
int main(void)
{
string input = get_string("Enter a positive integer: ");
for (int i = 0, n = strlen(input); i < n; i++)
{
if (!isdigit(input[i]))
{
printf("Invalid Input!\n");
return 1;
}
}
// Convert string to int
printf("%i\n", convert(input));
}
int convert(string input)
{
// TODO
int n = strlen(input);
if (n == 0)
{
return number;
}
char last_digit = input[n - 1];
int converted_last_digit = last_digit - '0';
input[n-1] = '\0';
return converted_last_digit + 10 * convert(input);
}
'; return converted_last_digit + 10 * convert(input); }

Heres the solution to the pset 3 practice problem atoi, and frankly, it leaves me with more questions than answers. First off, I have zero idea on how the variable "number" becomes the number. It's initialized at the top as 0, but somehow it becomes the number you put in at the end of all this? Next, I have no idea what adding 10 at the last line of code will even do. Why 10? And when you do convert(input) at the end, how do you even end up with the number you put in? Lets say I put in 123. It starts with the last number (3), then the second to last number(2) and then the first number (1) . So why doesn't it return 321? Actually, I'm surprised it even returns a 3 digit number at all. When we get to the point that the converted_last_digit variable is equal to the 3, it loops again to get 2 and then 1. But where are those numbers stored? When it loops again, 2 is now equal to converted_last_digit. Then 1 is equal to converted last digit. That should be it right? How are those numbers coming back? Why isn't it just returning 1? How are those numbers saved?

答案1

得分: 0

变量 number 在这段代码中从未改变。它始终为 0。你可以简单地写成 return 0;

好的,假设你从 "123" 开始。你调用 convert("123");。这会取出最后一位数字,所以 converted_last_digit 是 3。现在,你这样做:

    return 3 + 10 * convert("12");

这将再次调用该函数,使用一个新的字符串。由于堆栈的魔力,这个函数有它自己独立的变量集。在处理 convert("12") 时,我们再次取出最后一位数字。那是 2。所以我们这样做:

    return 2 + 10 * convert("1");

第三次调用 convert 返回 1。

现在,我们开始撤销一切。convert("1") 的结果是 1。所以,倒数第二个语句变成了:

    return 2 + 10 * 1;

这将返回 12 给外部函数。然后该语句变成了:

    return 3 + 10 * 12;

这将返回 123。魔法发生在事情逐渐恢复正常的过程中。

英文:

The variable number is never changed in this code. It is always 0. You could just as well say return 0;.

OK, say you start with "123". You call convert("123");. That pulls off the final digit, so converted_last_digit is 3. Now, you do:

    return 3 + 10 * convert("12");

That calls the function again, with a new string. Thanks to the magic of the stack, this one has its own separate set of variables. In the processing of convert("12"), we again pull off the last digit. That's 2. So, we do:

    return 2 + 10 * convert("1");

That third call to convert returns 1.

Now, we unwind everything. The result of convert("1") was 1. So, that next-to-the-last statement becomes:

    return 2 + 10 * 1;

which returns 12 to the outer function. That statement then becomes:

    return 3 + 10 * 12;

which returns 123. The magic happens when things unwind.

huangapple
  • 本文由 发表于 2023年6月16日 07:37:40
  • 转载请务必保留本文链接:https://go.coder-hub.com/76486109.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定